将DataGrid列标头绑定到DataContext

时间:2012-01-17 08:22:49

标签: wpf data-binding mvvm datagrid

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

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

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

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

但是,我无法使用它来处理DataGrid列的Header属性。

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

2 个答案:

答案 0 :(得分:32)

您可能需要向上走回树以获取所需的DataContext:

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

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

答案 1 :(得分:4)

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

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