2010-09-28 3 views
0

Je veux lier mon en-tête DataGrid à une propriété sur le DataContext de la grille. Maintenant, je l'ai à travailler, mais je considère que cette solution temporaire:Comment lier DataGridColumn.Header à la propriété ViewModel?

<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> 

Le plus gros problème avec cette solution est qu'elle rend plus fragile fixation (sensible au contexte). Si le DataContext de la grille est utilisé dans un scénario maître/détail (ce qui rend le DataContext un BindingList au lieu d'un seul élément), je devrai remplacer update DataGrid DataContext par DataContext={Binding /}.

Existe-t-il un moyen plus fiable de lier à partir du DataGrid.HeaderTemplate que d'utiliser ElementName et se référant au DataContext?

Répondre

0

Une solution simple serait d'utiliser une ressource nommée

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

... 

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

Si tout est vraiment dynamique peut ne pas fonctionner. Lorsque j'ai créé une grille avec des colonnes plus dynamiques/basées sur des données, je ne les ai pas définies en XAML mais les ai générées dans le code derrière, où vous n'avez pas besoin de faire de DataContext relatif.

+0

Comment ça marche? Les informations contenues dans les en-têtes sont obtenues à partir des propriétés du ViewModel (lié au Grid DataContext), noe d'une source statique (comme un fournisseur d'informations d'en-tête) – Marius

+0

où créez-vous le DataContext de la Grid? l'alternative que j'ai mentionnée (créer les définitions de colonne dans le fichier CS, pas XAML) pourrait être mieux pour vous. –

+0

voici deux ressources décentes sur la création de colonnes dynamiques: http://elegantcode.com/2010/03/08/silverlight-datagrid-populate-dynamic-columns-from-a-child-collection/ ET http: // www .silverlightshow.net/items/Définition de Silverlight-DataGrid-Columns-at-Runtime.aspx –

Questions connexes