我在数据模板中有几个TextBlock,如下所示:
<DataTemplate>
<StackPanel x:Name="stackPanelItems" Orientation="Horizontal">
<TextBlock x:Name="myTextBox" HorizontalAlignment="Center" VerticalAlignment="Top" FontSize="14" />
</StackPanel>
</DataTemplate>
现在我们需要在某些情况下进行myTextBox
Collsapsed,但不想使用加载或点击事件,然后通过sender
访问控件。
我可以使用任何其他方法或方式吗?
谢谢,
Subhen
答案 0 :(得分:2)
不幸的是,这样做的方法就像访问命名对象一样简单。假设您正在使用绑定来填充此数据模板,一个选项是迭代父控件的子对象并根据已知值检查文本字段。稍微清洁可能是使用Tag属性(可以绑定到任何对象)并以这种方式进行比较。
另一个选项(我最经常使用的那个选项)是将属性添加到您绑定的对象,并将该属性绑定到可见性(如果需要,使用转换器)。例如,如果您当前绑定到ObservableCollection&lt; string&gt ;,将绑定更改为ObservableCollection&lt; StringWithVisibility&gt; StringWithVisibility的样子:
public class StringWithVisibility
{
public string Text {get; set;}
public bool IsVisible {get; set;}
}
然后你的模板看起来像:
<DataTemplate>
<StackPanel x:Name="stackPanelItems" Orientation="Horizontal">
<TextBlock Text="{Binding Text}" Visibility={Binding IsVisible, Converter={StaticResource BoolVisibilityConverter}} />
</StackPanel>
</DataTemplate>
您已创建适当的IValueConverter作为资源。如果您不熟悉转换器,则文档位于:http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter(VS.95).aspx
答案 1 :(得分:1)
转换器是最好的方法,但要回答你的问题,你可以通过这种方式访问控件,代码在后面:
TextBox myTextbox = GetTemplateChild("myTextbox") as Textbox;
if (myTextbox != null)
{
// do something
}