【问题标题】:How to Access a Control present inside a DataTemplate如何访问存在于 DataTemplate 中的控件
【发布时间】:2010-05-27 11:11:00
【问题描述】:

我在 Data 模板中的 TextBlock 很少,如下所示:

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

现在我们需要在某些场景下使myTextBox Collsapsed 但不想使用loaded 或click 事件,然后通过sender 访问控件。

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

谢谢,

【问题讨论】:

  • @Slugster,我在数据模板中有 4 个不同的文本框,我想从不同的按钮单击中交换 Visibiti 选项。
  • 您的问题没有意义。要使名为 myTextBox 的文本块折叠,只需将其可见性属性更改为折叠即可。自从您命名它以来,您就有了对它的引用。这可以在任何你想做的地方的代码中完成。
  • @Wallstreet 程序员,如果文本框存在于 DataTemplate 中,我们将无法通过其名称访问文本框。建议你自己试试。

标签: wpf silverlight silverlight-3.0 datatemplate itemtemplate


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    TextBox myTextbox = GetTemplateChild("myTextbox") as Textbox;
    if (myTextbox != null)
    {
       // do something
    }
    

    【讨论】:

    猜你喜欢
    • 2013-04-28
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    相关资源
    最近更新 更多