如何在WPF MVVM中将列标题绑定到ViewModel的属性?

9
我有一个窗口,它的DataContext绑定到ViewModel对象(以VM1为例)。 VM1有很多属性,其中一个是名为"MyTitle"的字符串。
我在'Window\Grid\DataGrid'中有一个DataGridTextColumn。如何将DataGridTextColumn中的"Header"属性绑定到我的VM1 ViewModel中的"MyTitle"属性?
谢谢!
3个回答

25

不幸的是,DataGrid 的列定义不继承 DataContext,因为它们不是可视树的一部分,所以你不能直接将其绑定到 ViewModel。你需要使用一种解决方法,例如这篇文章中描述的方法:

<DataGrid.Resources>
    <local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>

...

<DataGridTextColumn Header="{Binding Data.MyTitle, Source={StaticResource proxy}}"/>

2
给这个人颁发一枚奖章!非常感谢你!它运行得很好! - Fredrik

2

没有必要使用绑定代理,尽管经常被建议使用。 显然,DataGridColumn.Header不是一个DependencyProperty。为了仍然进行绑定,只需使用XAML属性元素语法明确定义Header,并绑定标题内容:

<DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn>
      <DataGridTextColumn.Header>
        <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=DataContext.TextValue}" />
      </DataGridTextColumn.Header>
    </DataGridTextColumn>
  </DataGrid.Columns>
</DataGrid>

1
接受的答案对我无效。 我能够使这个工作。
<FrameworkElement x:Name="proxy" DataContext="{Binding}"/>

<DataGridTextColumn Header="{Binding Source={x:Reference proxy}, Path=DataContext.MyTitle}/>

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