将DataGrid列标头绑定到DataContext

Chr*_*ang 11 data-binding wpf datagrid mvvm

我知道之前已经问过这个问题,但是"以前的"答案似乎对我没什么影响......

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

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

<TextBlock Text="{Binding Text[Name], FallbackValue='Name'" />
Run Code Online (Sandbox Code Playgroud)

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

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

H.B*_*.B. 34

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

<DataGridTextColumn Binding="{Binding Name}">
    <DataGridTextColumn.HeaderTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding DataContext.Text[Name],
                       RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
        </DataTemplate>
    </DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

<DataGridTextColumn Binding="{Binding Name}">
  <DataGridTextColumn.Header>
    <TextBlock Text="{Binding DataContext.Text[Name],
                      RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
  </DataGridTextColumn.Header>
</DataGridTextColumn>
Run Code Online (Sandbox Code Playgroud)