J'ai un DataGrid, lié à un DataTable. Je veux afficher du texte dans le RowHeader, pour obtenir quelque chose comme ceci:
Col0 Col1 Col2 Col3
Table | 1 | 3 | 5 | 6 |
Chair | 3 | 2 | 1 | 8 |
Est-ce possible et si oui, comment puis-je faire cela?
J'ai essayé les deux réponses et aucune n'a fonctionné pour moi. Essentiellement, je devais les mélanger.
Cela fonctionne pour moi:
<DataGrid name="ui_dataGrid>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type DataGridRow}},
Path=Item.Header}"/>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
</DataGrid>
L'astuce consiste à rechercher l'ancêtre DataGridRow
, puis liez l'attribut TextBlock.Text
à la propriété de son élément qui vous tient à coeur, dans ce cas Header
(plus facile à dire en XAML qu'en anglais).
Puis dans le fichier .xaml.cs:
ui_dataGrid.ItemsSource = dataSource.Rows;
N.B. Chaque objet Row
a une propriété Header
qui est ce que je lie également.
Il y avait deux façons de le faire, l'exemple précédent l'avait presque, mais la liaison échouerait pour résoudre la propriété car l'expression manquait "DataContext".
<DataGrid>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding DataContext.YourProperty}"></TextBlock>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
<!--your stuff-->
</DataGrid>
La deuxième façon de le faire est de créer un convertisseur pour obtenir la liaison, de l'analyser dans le convertisseur et de cracher la valeur de chaîne souhaitée:
<Views:DataGridRowDataContextToRowHeaderValueConverter x:Key="toRowHeaderValue"/>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type DataGridRow}},
Converter={StaticResource toRowHeaderValue}}"/>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
Exemple de code de convertisseur:
public class DataGridRowDataContextToRowHeaderValueConverter : IValueConverter
{
public object Convert (object value, Type targetType, object parameter,
CultureInfo culture)
{
var dataGridRow = (DataGridRow) value;
var row = (GridModelExtensions.HourRow) dataGridRow.DataContext;
return row.Days[0].Hour;
}
}
Essayez de définir le modèle d'en-tête de ligne, quelque chose comme ceci
<DataGrid>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding YourProperty}"></TextBlock>
</DataTemplate>
</DataGrid.RowHeaderTemplate>uff
//your stuff
</DataGrid>
Juste pour votre information, si vous vous liez directement à une table de données, alors ce texte de liaison a fonctionné pour moi:
{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type DataGridRow}},
Path=Item.Row.Header}
Un petit peu et trouvé que dans le chemin Item.Row.Header
, le chemin commence par le DataGridRow , le Item
vous amène au DataGridView , et le Row
vous mène au DataRow .
Encore une fois, si vous vous liez directement à la table de données.
Vous y étiez presque, il vous suffit de remplacer AncestorType par DataGridRow au lieu de DataGrid , les en-têtes de ligne seront alors différents pour chaque ligne, par exemple .
@ michele: Si je modifie la liaison à:
<TextBlock Text="{Binding DataContext.YourProperty, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}"/>
alors ça marche presque. Le problème est que cela entraîne le même en-tête de ligne pour chaque ligne.