C# WPF与RelativeSource和AncestorType的绑定

C# WPF与RelativeSource和AncestorType的绑定,c#,wpf,xaml,C#,Wpf,Xaml,我有一个WPF应用程序。它有一个分为4行的网格。在第2行中,我有一个datagrid,它的datacontext设置为OrderBlock的对象。这一切都很好。但是,我希望datagrid的列标题文本值之一绑定到视图模型中的属性 下面是一个我尝试失败的例子 <DataGridTextColumn Header="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=ColumnHead

我有一个WPF应用程序。它有一个分为4行的网格。在第2行中,我有一个datagrid,它的datacontext设置为OrderBlock的对象。这一切都很好。但是,我希望datagrid的列标题文本值之一绑定到视图模型中的属性

下面是一个我尝试失败的例子

<DataGridTextColumn Header="{Binding RelativeSource={RelativeSource 
   AncestorType={x:Type Window}}, Path=ColumnHeadInfo}" 
   Binding="{Binding RejectReason}" IsReadOnly="True"/>

窗口
没有名为
ColumnHeadInfo
的属性,但我假设您的ViewModel是窗口的
数据上下文
,这可能有此属性

如果是,请尝试以下方法:

Path=DataContext.ColumnHeadInfo
编辑:
因为这并不能解决您的问题:原因可能是
DataGridColumn
不是可视化树的一部分,因此找不到任何父元素,因为它没有任何父元素。因此,
RelativeSource AncestorType
绑定不会产生任何结果。这应该通过输出窗口中的警告来指示。可能会对您有所帮助。

我使用“标记接口”而不是控件来查找正确的数据上下文

“标记接口”只是空接口:

 public interface IDataContextColumnHeadInfoMarker{}
我知道的具有正确datacontext的视图用接口标记

public partial class MyViewWiththeDatagrid : UserControl, IDataContextMarkerLadeSolldatenCommand  
现在我可以使用带有relativesource绑定的接口,而不是控件或ancestorlevel,这在某些情况下使事情变得更简单:)


是的,您的假设是正确的。我已将DataContext.ColumnHeaderInfo放入,但仍不工作。我已经检查了我的视图模型中的属性ColumnHeaderInfo是否也有值。gehho是正确的,所以请检查窗口的datacontext是否正确。使用Snoop()Mmmh,出现问题的原因可能是
DataGridColumn
不是可视化树的一部分,因此找不到任何父元素,因为它没有任何父元素。因此,
RelativeSource AncestorType
绑定不会产生任何结果。这应该通过输出窗口中的警告来指示。也许,可以帮助你。把上面的评论作为我答案的一部分…你在这个答案中提供的链接正是我一直在寻找的
<DataGridTextColumn Header="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:IDataContextColumnHeadInfoMarker}}, Path=DataContext.ColumnHeadInfo}"