wpf:祖先的FindAncestor

时间:2011-06-19 14:18:06

标签: .net wpf binding

我有一个绑定到ViewModel的UserControl。在UserControl上绑定了一个项目列表(类对象)。因此,当我想将各种元素绑定到DataGrid的RowDetails模板上的属性时,我使用:

"{Binding RelativeSource={RelativeSource FindAncestor, 
                          AncestorType={x:Type UserControl}}, 
               Path=DataContext.SomeProperty}"

这很好用。现在我想将RowDetails的东西分解为UserControl,我可以在其他顶级UserControls中使用DataGrids。那么我如何找到UserControl,它是UserControl的祖先,在其中编写了这个绑定语句?

我无法在x:Type声明中指定顶级UserControl的名称,因为它每次都不同。

2 个答案:

答案 0 :(得分:5)

查看AncestorLevel

"{Binding RelativeSource={RelativeSource FindAncestor,  
                                         AncestorType={x:Type UserControl},
                                         AncestorLevel=2},
          Path=DataContext.SomeProperty}"

答案 1 :(得分:5)

您可以使用AncestorLevel执行此操作,但我非常怀疑这是绑定的正确方法。

您将拥有一个UserControl,它取决于它在逻辑树中的位置。

如果要在这两个中间插入一些其他用户控件,它将停止工作。

绑定的正确方法是使用提供给控件的Datacontext。

如果缺少某些数据而不是使用datacontext来获取它,即使这意味着从其父级的datacontext中读取它。