如果我有以下XAML:
<toolkit:DataForm Height="100" x:Name="form"> <toolkit:DataForm.EditTemplate> <DataTemplate> <StackPanel Name="stack"></StackPanel> </DataTemplate> </toolkit:DataForm.EditTemplate> </toolkit:DataForm>我可以通过this.FindName(“表单”)从视图中获取对“表单”的引用。
如何获得“堆叠”的引用? FindName返回null。
答案 0 :(得分:4)
这里的问题是DataTemplate
的xaml内容属于与外部Xaml不同的NameScope。在元素上调用FindName
仅搜索最初生成元素的NameScope。因此,在FindName
上调用UserControl
将找不到由DataTemplate
生成的元素。原因是DataTemplate
(和其他模板)被设计为多次重复使用,NameScope的使用消除了名称的歧义。
解决方案是调用VisualTreeHelper
的帮助,查看此blog中的代码,了解我对VisualTreeHelper
的看法。将该博客的VisualTreeEnumeration
课程添加到您的项目中即可: -
var element = this.Descendents().OfType<FrameworkElement>().FirstOrDefault(fe => fe.Name == "stack");
当然,如果您知道“堆叠”是StackPanel
,那么您可以通过.OfType<T>
获得更具体的信息。