从数据模板中按名称获取对象引用

问题描述

| 如果我具有以下XAML:                                                                   我可以从View中通过this.FindName(\“ form \”)获得对\“ form \”的引用。 如何获得对“堆栈”的引用? FindName返回null。     

解决方法

这里的问题是,“ 0”的xaml内容与外部Xaml属于不同的NameScope。在元素上调用“ 1”仅搜索最初生成该元素的NameScope。因此,在
UserControl
上调用
FindName
不会找到
DataTemplate
生成的元素。这样做的原因是,“ 0”(和其他模板)被设计为可以重复使用多次,使用NameScope可以消除名称的歧义。 解决方案是调用
VisualTreeHelper
的帮助,请看一下本博客中的代码,以了解我对
VisualTreeHelper
的看法。通过将该博客中的“ 8”类添加到您的项目中,您可以执行以下操作:
var element = this.Descendents().OfType<FrameworkElement>().FirstOrDefault(fe => fe.Name == \"stack\");
当然,如果您知道\“ stack \”是
StackPanel
,则可以使用
.OfType<T>
来更具体。