Wpf 如何从DataGridColumn.Header绑定到ViewModel属性?

Wpf 如何从DataGridColumn.Header绑定到ViewModel属性?,wpf,Wpf,我想将我的datagrid头绑定到网格的DataContext上的属性。现在,我开始工作了,但我认为这是暂时的解决方案: <DataGrid x:Name="grid" ItemsSource="{Binding Path=Items}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Path=

我想将我的datagrid头绑定到网格的DataContext上的属性。现在,我开始工作了,但我认为这是暂时的解决方案:

    <DataGrid x:Name="grid" ItemsSource="{Binding Path=Items}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path=Description}">
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding ElementName=grid, Path=DataContext.ItemsUnit}"></TextBlock>
                    </DataTemplate>

此解决方案的最大问题是它使绑定更加脆弱(上下文敏感)。如果网格的DataContext用于主/详细场景(这使DataContext成为绑定列表而不是单个项),我将不得不用
DataContext={Binding/}
替换更新DataGrid DataContext


从DataGrid.HeaderTemplate绑定是否有比使用ElementName和引用DataContext更可靠的方法?

一个简单的解决方案是使用命名资源

<UserControl.Resources>
  <ResourceDictionary>
    <MyNamespace:MyHeaderProvider x:Key="MyHeaderProvider">
  </ResourceDictionary>
</UserControl.Resources>

...

Header="{Binding Path=HeaderText, Source={StaticResource MyHeaderProvider}"

...
Header=“{Binding Path=HeaderText,Source={StaticResource MyHeaderProvider}”

如果一切都是动态的,那么这可能不起作用。当我创建一个包含更多动态/数据驱动列的网格时,我没有在XAML中定义它们,而是在代码隐藏中生成它们,在代码隐藏中,您不必执行相对数据上下文。

这是如何工作的?标题中的信息是从ViewModel上的属性获得的(绑定到Grid DataContext),来自静态源(如标题信息提供程序)的noe,您在哪里创建网格的DataContext?我提到的替代方法(在CS文件中创建列定义,而不是XAML)可能更适合您