【问题标题】:Binding DataGrid column Header to DataContext将 DataGrid 列标题绑定到 DataContext
【发布时间】:2012-02-12 01:49:24
【问题描述】:

我知道以前有人问过这个问题,但“以前”的答案似乎都不适合我......

我已经在我的应用程序中实现了多语言功能,因此我必须将我的 DataGrid 列的标题绑定到 DataContext。

我在 DataContext 中使用字典(在下面的示例中称为 Text)来存储文本,并且绑定适用于文本块、按钮等。

<TextBlock Text="{Binding Text[Name], FallbackValue='Name'" />

但是,我不能让它在 DataGrid 列的 Header 属性上工作。

我在某处读到,我需要为列/标题编写一个模板来实现这一点,但我也想不通。

【问题讨论】:

    标签: wpf data-binding mvvm datagrid


    【解决方案1】:

    正确。 视觉树中没有直接映射到DataGridTextColumn 的元素,因此您不能将RelativeSourceAncestorType 一起使用(即DataGridTextColumn 不是控件,因此它没有父控件)。 下面的代码应该可以正常工作

    <DataGridTextColumn Binding="{Binding Name}">
      <DataGridTextColumn.Header>
        <TextBlock Text="{Binding DataContext.Text[Name],
                          RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
      </DataGridTextColumn.Header>
    </DataGridTextColumn>
    

    【讨论】:

    • 谢谢,这没有 HeaderTemplate 解决方案那么痛苦,而且它仍然有效。但是有没有办法使用Header="{Some stringified binding}" 属性来做同样的事情?
    • 在 .NET 4.5 和 4.6 上试过这个,虽然它有点工作,但它导致了不一致的行为,当绑定对象更新时 DataGrid 不会可靠地更新。不过,接受答案中的方法确实有效。
    【解决方案2】:

    你可能需要往回走,才能得到你想要的 DataContext:

    <DataGridTextColumn Binding="{Binding Name}">
        <DataGridTextColumn.HeaderTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding DataContext.Text[Name],
                           RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
            </DataTemplate>
        </DataGridTextColumn.HeaderTemplate>
    </DataGridTextColumn>
    

    直接在 Header 属性上执行此操作将不起作用,因为它无法就地解析,因为该列是未出现在树中的抽象对象。

    【讨论】:

    • Header vs HeaderTemplate 是关键。谢谢。
    猜你喜欢
    • 2015-01-21
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2012-11-22
    • 2013-11-16
    • 1970-01-01
    • 2010-11-01
    • 2010-10-13
    相关资源
    最近更新 更多