[UWP] [XAML]如何以编程方式访问Listbox的数据模板中存在的控件 [英] [UWP][XAML]How to access a control present inside Data template of Listbox programatically
问题描述
在我的应用程序中,我想访问一个文本块列表框的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;的HorizontalAlignment = 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;的HorizontalAlignment = 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屋!