如何访问DataTemplate中存在的控件

时间:2010-05-27 11:11:01

标签: wpf silverlight silverlight-3.0 datatemplate itemtemplate

我在数据模板中有几个TextBlock,如下所示:

 <DataTemplate>
    <StackPanel x:Name="stackPanelItems" Orientation="Horizontal">
        <TextBlock  x:Name="myTextBox" HorizontalAlignment="Center" VerticalAlignment="Top"   FontSize="14" />
    </StackPanel>
  </DataTemplate>

现在我们需要在某些情况下进行myTextBox Collsapsed,但不想使用加载或点击事件,然后通过sender访问控件。

我可以使用任何其他方法或方式吗?

谢谢,

Subhen

2 个答案:

答案 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
}