【问题标题】:Getting an object reference by name from a DataTemplate从 DataTemplate 按名称获取对象引用
【发布时间】:2011-05-26 20:18:56
【问题描述】:

如果我有以下 XAML:

数据模板>
        
    
我可以从视图中通过 this.FindName("form") 获得对“form”的引用。

如何获得对“堆栈”的引用? FindName 返回空值。

【问题讨论】:

    标签: silverlight silverlight-4.0


    【解决方案1】:

    这里的问题是DataTemplate 的xaml 内容与外部Xaml 属于不同的NameScope。对元素调用 FindName 只会搜索最初生成该元素的 NameScope。因此在UserControl 上调用FindName 将找不到由DataTemplate 生成的元素。这样做的原因是 DataTemplate(和其他模板)被设计为可以多次重复使用,使用 NameScope 可以消除名称的歧义。

    解决方案是调用VisualTreeHelper 的帮助,查看blog 中的代码以了解我对VisualTreeHelper 的看法。将该博客中的 VisualTreeEnumeration 类添加到您的项目中后,您可以执行以下操作:-

    var element = this.Descendents().OfType<FrameworkElement>().FirstOrDefault(fe => fe.Name == "stack");
    

    当然,如果您知道“堆栈”是 StackPanel,那么您可以使用 .OfType&lt;T&gt; 获得更具体的信息。

    【讨论】:

      猜你喜欢
      • 2014-01-16
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 2023-01-25
      相关资源
      最近更新 更多