2017-02-22 2 views
3

Considérons le ViewModel suivant:Bind DataGridColumnHeader avec la propriété de ligne sélectionnée

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

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

Notez que j'utilise Fody's PropertyChanged pour faire mes propriétés ViewModel mettre en œuvre INotifyPropertyChanged.

Et je donne les résultats suivants 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> 

La liaison de Header avec NameHeader ne fonctionnera pas! Bien sûr, j'ai réalisé que différentes lignes auront des valeurs différentes de NameHeader.

Donc ce que je veux vraiment est de Header de colonne de liaison avec de NameHeader ligne sélectionnée. Comment puis-je y parvenir?

Répondre

1

Utilisez un HeaderTemplate avec un TextBlock qui se lie à la propriété SelectedItem du 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

Pourquoi n'a pas pensé à ça .. merci! –