将DataGrid列标题绑定到DataContext

12

我知道这个问题之前已经有人问过,但是所有之前的回答似乎对我都不起作用...

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

我在DataContext中使用一个名为Text的字典来存储文本,绑定文本块、按钮等都可以正常工作。

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

但是,我无法在DataGrid列的Header属性上使其工作。

我在某处读到,需要为列/标题编写模板才能实现此目的,但我也无法弄清楚如何做到这一点。

2个回答

36

您可能需要沿着树向上走以获取您想要的DataContext:

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

直接在Header属性上这样做是行不通的,因为它不能被就地解析,该列是一个抽象对象,不会出现在树中。


1
Header和HeaderTemplate是关键。谢谢。 - Martin Lottering

5

正确的做法是,DataGridTextColumn 没有直接映射到可视树中的任何元素,因此您无法使用 AncestorTypeRelativeSource(即 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}”属性来完成相同的技巧? - Adrian Ratnapala
1
尝试在.NET 4.5和4.6上运行此代码,虽然它有点起作用,但会导致不一致的行为,即当绑定对象更新时,DataGrid无法可靠地更新。但是,接受答案中的方法可以始终正常工作。 - fuglede

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接