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

时间:2010-09-28 16:53:22

标签: wpf

我想将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成为BindingList而不是单个项),我将不得不用DataContext={Binding /}替换更新DataGrid DataContext。

是否有更强大的方法从DataGrid.HeaderTemplate绑定而不是使用ElementName并引用DataContext?

1 个答案:

答案 0 :(得分:0)

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

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

...

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

如果一切都是动态的,这可能行不通。当我创建一个包含更多动态/数据驱动列的网格时,我没有在XAML中定义它们,而是在后面的代码中生成它们,在那里您不必执行相关的DataContext。