【问题标题】:WPF Binding with RelativeSource and AncestorTypeWPF 与 RelativeSource 和 AncestorType 绑定
【发布时间】:2017-05-31 03:04:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

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

    如果是这样,请试试这个:

    Path=DataContext.ColumnHeadInfo
    

    编辑:
    由于仅此一项并不能解决您的问题:原因可能是 DataGridColumn 不是可视树的一部分,因此找不到任何父元素,因为它没有任何父元素。因此,RelativeSource AncestorType 绑定不会产生任何结果。这应该通过输出窗口中的警告来指示。或许,this link 可以帮到你。

    【讨论】:

    • 是的,你的假设是正确的。我放了 DataContext.ColumnHeaderInfo 但仍然无法正常工作。我已经检查了我的视图模型中的属性 ColumnHeaderInfo 也确实有一个值。
    • gehho 是正确的,所以请检查您窗口的数据上下文是否正确。使用 Snoop (snoopwpf.codeplex.com)
    • 嗯,问题的原因可能是 DataGridColumn 不是可视树的一部分,因此找不到任何父元素,因为它没有任何父元素。因此,RelativeSource AncestorType 绑定不会产生任何结果。这应该通过输出窗口中的警告来指示。可能,this link 可以帮助你。
    • 将上述评论作为我回答的一部分...
    • 你在这个答案中提供的链接正是我一直在寻找的
    【解决方案2】:

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

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

     public interface IDataContextColumnHeadInfoMarker{}
    

    我所知道的具有正确数据上下文的视图标有界面

    public partial class MyViewWiththeDatagrid : UserControl, IDataContextMarkerLadeSolldatenCommand  
    

    现在我可以使用具有相对源绑定的接口而不是控件或祖先级别,这在某些情况下使事情变得更容易:)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多