问题描述
|
如果我具有以下XAML:
StackPanel>
DataTemplate>
toolkit:DataForm>
我可以从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>
来更具体。