[UWP] [XAML]如何以编程方式访问Listbox的数据模板中存在的控件 [英] [UWP][XAML]How to access a control present inside Data template of Listbox programatically

查看:95
本文介绍了[UWP] [XAML]如何以编程方式访问Listbox的数据模板中存在的控件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序中,我想访问一个文本块列表框的DataTemplate中存在,我想根据
a条件隐藏textBlock的可见性。



这是我的代码:


< ListBox 名称= QUOT; ListUsageDetails" >
$
< ListBox.ItemTemplate>

  &NBSP; < DataTemplate>

  &NBSP; < con:CustomTemplateSelector Content =" {Binding}">

  &NBSP; < con:CustomTemplateSelector.DataTemplateA>

  &NBSP; < DataTemplate>

  &NBSP; <网格宽度=" 435">

  &NBSP; < Grid.RowDefinitions>

  &NBSP; < RowDefinition Height =" Auto" />

  &NBSP; < RowDefinition Height =" Auto" />  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;  

  &NBSP; &NBSP; < /Grid.RowDefinitions>

  &NBSP; &NBSP; < Grid.ColumnDefinitions>

  &NBSP; &NBSP; < ColumnDefinition Width =" .6 *" />

  &NBSP; &NBSP; < ColumnDefinition Width =" .3 *" />

  &NBSP; &NBSP; < /Grid.ColumnDefinitions>

  &NBSP; &NBSP; < TextBlock VerticalAlignment =" Bottom"  FontFamily =" Segoe UI" 名称= QUOT; TxtBlock_CatagoryName" Grid.Row = QUOT; 0" Grid.Column = QUOT; 0" Text =" {Binding name}" fontWeight设置= QUOT; SemiBold"
Foreground =" Black" FontSize =" {Binding Converter = {StaticResource Scaler},ConverterParameter = 24}" TextWrapping =" Wrap" />

  &NBSP; < / Grid>

  < / DataTemplate>

  < / con:CustomTemplateSelector.DataTemplateA>



   < con:CustomTemplateSelector.DataTemplateB>

  &NBSP;  < DataTemplate>

  &NBSP;  < Grid Width =" 435">

  &NBSP;  < Grid.RowDefinitions>

  &NBSP;  < RowDefinition Height =" Auto" />  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   

  &NBSP; &NBSP; < /Grid.RowDefinitions>

  &NBSP; &NBSP; < Grid.ColumnDefinitions>

  &NBSP; &NBSP; < ColumnDefinition Width =" .6 *" />

  &NBSP; &NBSP; < ColumnDefinition Width =" .3 *" />

  &NBSP; &NBSP; < /Grid.ColumnDefinitions>

  &NBSP; &NBSP; < TextBlock VerticalAlignment =" Bottom"  FontFamily =" Segoe UI" 名称= QUOT; TxtBlock_CatagoryName" TextWrapping = QUOT;包覆与QUOT;&NBSP; Grid.Row = QUOT; 0" Grid.Column = QUOT; 0"&NBSP; &NBSP;的Horizo​​ntalAlignment = QUOT;左"
Text =" {Binding name}"前景= QUOT;黑色" FontSize =" {Binding Converter = {StaticResource Scaler},ConverterParameter = 24}" fontWeight设置= QUOT; SemiBold" />&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   

  &NBSP; &NBSP; < / Grid>

  &NBSP; &NBSP; < / DataTemplate>

  &NBSP; &NBSP;< / CON:CustomTemplateSelector.DataTemplateB>&NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   



  &NBSP; < con:CustomTemplateSelector.DataTemplateC>

  &NBSP; &NBSP;  < DataTemplate>

  &NBSP; &NBSP;  < Grid Width =" 435">

  &NBSP; &NBSP;  < Grid.RowDefinitions>

  &NBSP; &NBSP;  < RowDefinition Height =" Auto" />  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;
  

  &NBSP; &NBSP;  < /Grid.RowDefinitions>

  &NBSP; &NBSP; < Grid.ColumnDefinitions>

  &NBSP; &NBSP; < ColumnDefinition Width =" .6 *" />

  &NBSP; &NBSP; < ColumnDefinition Width =" .3 *" />

  &NBSP; &NBSP; < /Grid.ColumnDefinitions>

  &NBSP; &NBSP; < TextBlock VerticalAlignment =" Bottom"  FontFamily =" Segoe UI" fontWeight设置= QUOT; SemiBold"&NBSP;名称= QUOT; TxtBlock_CatagoryName" Grid.Row = QUOT; 0" Grid.Column = QUOT; 0"&NBSP;的Horizo​​ntalAlignment = QUOT;左"&NBSP;
Text =" {Binding name}"前景= QUOT;黑色" FontSize =" {Binding Converter = {StaticResource Scaler},ConverterParameter = 24}" TextWrapping = QUOT;包覆与QUOT;不透明度= QUOT 1 QUOT; />&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   

  &NBSP; &NBSP; < / Grid>

  &NBSP;  < / DataTemplate>

   < / con:CustomTemplateSelector.DataTemplateC>

   < / con:CustomTemplateSelector>

  &NBSP; < / DataTemplate>

< /ListBox.ItemTemplate>

< / ListBox>



CustomTemplateSelector的代码:

  公开       CustomTemplateSelector        DataTemplateSelector   
{
公开 DataTemplate DataTemplateA { 得到 ; 设置 ; }
公开 DataTemplate DataTemplateB { 得到 ; 设置 ; }
公开 DataTemplate DataTemplateC { 得到 ; 设置 ; }

公开 覆盖 DataTemplate SelectTemplate object item < span class ="pun"style ="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit ; vertical-align:baseline; color:#303336">, DependencyObject 容器
{

如果 item != null
{

如果 // somecondition1)
返回 DataTemplateA ;

其他 如果 // somecondition2)
返回 DataTemplateC ;
其他
返回 DataTemplateB ;

}
返回 基地 SelectTemplate item < span class ="pln"style ="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit ; vertical-align:baseline; color:#303336"> container );
}
}


解决方案


Hi Mars771,



如果要访问数据模板中的命名控件(如文本块),可以使用

VisualTreeHelper.GetChildrenCount()方法
。像这样:





 

 private List< FrameworkElement> GetChildren(DependencyObject parent,string ctrlName)
{
List< FrameworkElement> controls = new List< FrameworkElement>();

for(int i = 0; i< VisualTreeHelper.GetChildrenCount(parent); ++ i)
{
var child = VisualTreeHelper.GetChild(parent,i);
if(child is FrameworkElement&& child.Name == ctrlName)
{
controls。添加(child as FrameworkElement);
}
controls.AddRange(GetChildren(child));
}

返回控件;
}







还有一个官方样本,你可以参考:

https://code.msdn.microsoft.com/windowsapps/How-to-access-a-control-6039571a



 



最好的问候,



罗伊


In my application I want to access a textblock which is present inside the DataTemplate of Listbox and I want to hide the visiblity of textBlock based on a condition.

Here is my code:

<ListBox  Name="ListUsageDetails" >
<ListBox.ItemTemplate>
    <DataTemplate>
    <con:CustomTemplateSelector Content="{Binding}">
    <con:CustomTemplateSelector.DataTemplateA>
    <DataTemplate>
    <Grid Width="435">
    <Grid.RowDefinitions>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="Auto"/>                                                   
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
      <ColumnDefinition Width=".6*"/>
      <ColumnDefinition Width=".3*"/>
      </Grid.ColumnDefinitions>
      <TextBlock VerticalAlignment="Bottom"  FontFamily="Segoe UI"  Name="TxtBlock_CatagoryName" Grid.Row="0" Grid.Column="0" Text="{Binding name}" FontWeight="SemiBold" Foreground="Black" FontSize="{Binding Converter={StaticResource Scaler},ConverterParameter=24}" TextWrapping="Wrap"/>
    </Grid>
  </DataTemplate>
  </con:CustomTemplateSelector.DataTemplateA>

   <con:CustomTemplateSelector.DataTemplateB>
     <DataTemplate>
     <Grid Width="435">
     <Grid.RowDefinitions>
     <RowDefinition Height="Auto"/>                                                
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
      <ColumnDefinition Width=".6*"/>
      <ColumnDefinition Width=".3*"/>
      </Grid.ColumnDefinitions>
      <TextBlock VerticalAlignment="Bottom"  FontFamily="Segoe UI"  Name="TxtBlock_CatagoryName" TextWrapping="Wrap"  Grid.Row="0" Grid.Column="0"   HorizontalAlignment="Left" Text="{Binding name}" Foreground="Black" FontSize="{Binding Converter={StaticResource Scaler},ConverterParameter=24}" FontWeight="SemiBold"/>                                                  
      </Grid>
      </DataTemplate>
     </con:CustomTemplateSelector.DataTemplateB>            

    <con:CustomTemplateSelector.DataTemplateC>
       <DataTemplate>
       <Grid Width="435">
       <Grid.RowDefinitions>
       <RowDefinition Height="Auto"/>                                                        
       </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
      <ColumnDefinition Width=".6*"/>
      <ColumnDefinition Width=".3*"/>
      </Grid.ColumnDefinitions>
      <TextBlock VerticalAlignment="Bottom"  FontFamily="Segoe UI" FontWeight="SemiBold"  Name="TxtBlock_CatagoryName" Grid.Row="0" Grid.Column="0"  HorizontalAlignment="Left"  Text="{Binding name}" Foreground="Black" FontSize="{Binding Converter={StaticResource Scaler},ConverterParameter=24}" TextWrapping="Wrap" Opacity="1"/>                                                    
      </Grid>
     </DataTemplate>
   </con:CustomTemplateSelector.DataTemplateC>
   </con:CustomTemplateSelector>
    </DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

Code for CustomTemplateSelector:

public class CustomTemplateSelector : DataTemplateSelector
 {
    public DataTemplate DataTemplateA { get; set; }
    public DataTemplate DataTemplateB { get; set; }
    public DataTemplate DataTemplateC { get; set; }

  public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {

    if (item != null)
        {

            if (//somecondition1)
                return DataTemplateA;

            else if (//somecondition2)
                return DataTemplateC;              
            else
                return DataTemplateB;

        }
        return base.SelectTemplate(item, container);
    }
}

解决方案

Hi Mars771,

If you want to access to a named control in the data template like a textblock, you could use VisualTreeHelper.GetChildrenCount() method. Like this:

 

private List<FrameworkElement> GetChildren(DependencyObject parent , string ctrlName) 
        { 
            List<FrameworkElement> controls = new List<FrameworkElement>(); 
  
            for(int i = 0; i< VisualTreeHelper.GetChildrenCount(parent); ++i) 
            { 
                var child = VisualTreeHelper.GetChild(parent, i); 
                if (child is FrameworkElement && child.Name == ctrlName) 
                { 
                    controls.Add(child as FrameworkElement); 
                } 
                controls.AddRange(GetChildren(child)); 
            } 
  
            return controls; 
        }


There is also an official sample that you could refer: https://code.msdn.microsoft.com/windowsapps/How-to-access-a-control-6039571a

 

Best regards,

Roy


这篇关于[UWP] [XAML]如何以编程方式访问Listbox的数据模板中存在的控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆