使用RelativeSource和AncestorType进行WPF绑定

时间:2013-12-20 13:50:24

标签: c# wpf xaml

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

以下是我尝试失败的示例。

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

2 个答案:

答案 0 :(得分:8)

Window没有名为ColumnHeadInfo的属性,但我认为您的ViewModel是您的Window DataContext,这可能有此属性?!

如果是这样,请改为尝试:

Path=DataContext.ColumnHeadInfo

修改
因为单凭这并没有解决你的问题:原因可能是DataGridColumn不是可视树的一部分,因此找不到任何父元素,因为它没有任何元素。因此,RelativeSource AncestorType绑定不会产生任何结果。这应该在输出窗口中显示警告。可能this link可能对您有帮助。

答案 1 :(得分:2)

而不是控件我使用“标记接口”来找到正确的datacontext。

“marker interfaces”只是空接口:

 public interface IDataContextColumnHeadInfoMarker{}

我知道的视图有正确的datacontext标有接口

public partial class MyViewWiththeDatagrid : UserControl, IDataContextMarkerLadeSolldatenCommand  

现在我可以使用带有relativesource绑定的接口而不是控件或者ancestorlevel,这使得某些情况更容易:)

<DataGridTextColumn Header="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:IDataContextColumnHeadInfoMarker}}, Path=DataContext.ColumnHeadInfo}"