2

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

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

现在我们需要myTextBox在某些场景下制作 Collsapsed 但不想使用加载或点击事件然后通过sender.

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

谢谢,

苏亨

4

2 回答 2

2

不幸的是,有一种方法可以像访问命名对象一样简单。假设您使用绑定来填充此数据模板,一种选择是遍历父控件的子对象并根据已知值检查文本字段。稍微干净一点可能是使用 Tag 属性(可以绑定到任何对象)并以这种方式进行比较。

另一种选择(我最常用于此类事情的选择)是将属性添加到您要绑定的对象并将该属性绑定到可见性(如有必要,使用转换器)。例如,如果您当前正在绑定到 ObservableCollection< string >,请将绑定更改为 ObservableCollection< StringWithVisibility >,其中 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

于 2010-05-27T18:42:03.367 回答
1

转换器是最好的方法,但要回答你的问题,你可以通过这种方式访问​​控件,在后面的代码中:

TextBox myTextbox = GetTemplateChild("myTextbox") as Textbox;
if (myTextbox != null)
{
   // do something
}
于 2010-05-28T10:14:25.127 回答