2017-02-22 11 views
3

Рассмотрим следующий ViewModel:Bind DataGridColumnHeader со свойством выбранной строки в

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> 

Связывание Header с NameHeader не будет работать! Конечно, тогда я понял, что разные строки будут иметь разные значения NameHeader.

Так что я действительно хочу, чтобы связать колонки Header с выбранным Роу NameHeader. Как я могу это достичь?

ответ

1

Используйте HeaderTemplate с TextBlock, который связывается с SelectedItem свойство DataGrid:

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

Почему я не думал об этом .. спасибо! –

Смежные вопросы