从DataTemplate按名称获取对象引用

时间:2011-05-26 11:48:15

标签: silverlight silverlight-4.0

如果我有以下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。

1 个答案:

答案 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>获得更具体的信息。