将 DataGridColumnHeader 与所选行的 属性 绑定

Bind DataGridColumnHeader with selected row's property

考虑以下 ViewModel:

public class MyViewModel 
{
    public ObservableCollection<Foo> foos { get; set; }
}

[PropertyChanged.ImplementPropertyChanged]
public class Foo
{
    public string Name { get; set; }
    public string NameHeader { get; set; }
}

请注意,我正在使用 Fody's PropertyChanged 使我的 ViewModel 属性实现 INotifyPropertyChanged

我有以下 DataGrid:

<DataGrid x:Name="FooTable"
          ItemsSource="{Binding Path=foos}"
          AutoGenerateColumns="False"
          CanUserAddRows="True"
          AutomationProperties.IsColumnHeader="True"
          SelectionMode="Single"
          SelectionUnit="FullRow">

          <DataGrid.Columns>
              <DataGridTextColumn 
                  Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                  Header="{Binding NameHeader, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" 
                  Width="Auto" />
          </DataGrid.Columns>
</DataGrid>

HeaderNameHeader 的绑定无效!当然,然后我意识到不同的行将具有不同的 NameHeader 值。

所以我真正想要的是 将列的 Header 与所选行的 NameHeader 绑定。我怎样才能做到这一点?

使用 HeaderTemplateTextBlock 绑定到 DataGridSelectedItem 属性:

<DataGridTextColumn Binding="{Binding Name}" Width="Auto">
    <DataGridTextColumn.HeaderTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=SelectedItem.NameHeader, RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
        </DataTemplate>
    </DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>