wpf:祖先的FindAncestor

Gil*_*lit 6 .net wpf binding

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

"{Binding RelativeSource={RelativeSource FindAncestor, 
                          AncestorType={x:Type UserControl}}, 
               Path=DataContext.SomeProperty}"
Run Code Online (Sandbox Code Playgroud)

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

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

Won*_*ane 5

看看AncestorLevel.

"{Binding RelativeSource={RelativeSource FindAncestor,  
                                         AncestorType={x:Type UserControl},
                                         AncestorLevel=2},
          Path=DataContext.SomeProperty}"
Run Code Online (Sandbox Code Playgroud)


Mar*_*mić 5

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

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

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

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

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