如果我有以下 XAML:
<toolkit:DataForm Height="100" x:Name="form"> <toolkit:DataForm.EditTemplate> <DataTemplate> <StackPanel Name="stack"></StackPanel> </DataTemplate> </toolkit:DataForm.EditTemplate> </toolkit:DataForm>我可以通过 this.FindName("form") 从 View 中获取对“表单”的引用。
如何获得对“堆栈”的引用? FindName 返回空值。
最佳答案
这里的问题是 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");
当然如果你知道“stack”是一个StackPanel
然后你可以通过 .OfType<T>
获得更具体的信息.
关于silverlight - 从 DataTemplate 按名称获取对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6137967/