Wpf 将DataGrid列标题绑定到DataContext

Wpf 将DataGrid列标题绑定到DataContext,wpf,data-binding,mvvm,datagrid,Wpf,Data Binding,Mvvm,Datagrid,我知道以前有人问过这个问题,但“以前”的答案似乎都不适合我 我已经在我的应用程序中实现了多语言的功能,因此我必须将DataGrid列的标题绑定到DataContext 我在DataContext中使用了一个字典(在下面的例子中称为Text)来存储文本,绑定可以很好地处理文本块、按钮等 <TextBlock Text="{Binding Text[Name], FallbackValue='Name'" /> 但是,我无法在DataGrid列的Header属性上使用此功能 我在某

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

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

我在DataContext中使用了一个字典(在下面的例子中称为Text)来存储文本,绑定可以很好地处理文本块、按钮等

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

但是,我无法在DataGrid列的Header属性上使用此功能


我在某个地方读到,我需要为列/标题编写一个模板来实现这一点,但我也无法解决这个问题。

您可能需要返回树以获取所需的数据上下文:

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

直接在
标题
属性上执行此操作将不起作用,因为该列是一个抽象对象,没有出现在树中,因此无法就地解析。

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

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


Header vs HeaderTemplate是关键。谢谢。谢谢,这比HeaderTemplate解决方案痛苦少,而且仍然有效。但是有没有一种方法可以使用
头=“{Some stringized binding}”
属性来实现同样的技巧呢?在.NET 4.5和4.6上尝试过这种方法,虽然有点奏效,但它导致了不一致的行为,即当绑定对象更新时,
数据网格
无法可靠地更新。不过,公认答案中的方法确实能始终如一地发挥作用。