WPF DataGrid RowHeader databinding
j'ai un DataGrid, relié à un DataTable. Je veux afficher du texte dans la 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?
6 réponses
j'ai essayé les deux réponses, et aucune n'a fonctionné pour moi. Ce que j'avais à faire, c'était de 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>
Le truc est de trouver l'ancêtre DataGridRow
, alors liez le TextBlock.Text
attribuent à la propriété de son élément que vous vous souciez, dans ce cas Header
(plus facile à dire en XAML qu'en anglais peut-être).
Puis dans le .XAML.cs:
ui_dataGrid.ItemsSource = dataSource.Rows;
N.B. Chacun Row
l'objet a un Header
propriété qui est ce que je suis la liaison de trop.
2 façons de le faire, l'exemple précédent l'avait presque mais la reliure ne résoudrait pas la propriété parce que l'expression manquait "DataContext."
<DataGrid>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding DataContext.YourProperty}"></TextBlock>
</DataTemplate>
</DataGrid.RowHeaderTemplate>uff
//your stuff
</DataGrid>
2è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 quelle que soit la valeur de chaîne que vous voulez:
<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>
//sample converter code
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 configurer le modèle rowheader, quelque chose comme ceci
<DataGrid>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding YourProperty}"></TextBlock>
</DataTemplate>
</DataGrid.RowHeaderTemplate>uff
//your stuff
</DataGrid>
juste pour info, 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}
Piquer un peu et trouvé que, dans le Item.Row.Header
chemin, le chemin commence à l' DataGridRow, le Item
passe DataGridView et Row
passe DataRow.
Encore une fois, si vous vous liez directement à la table de données.
@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 résulte dans le même en-tête de ligne pour chaque ligne.
Vous avez été près de là, il suffit de changer le AncestorType DataGridRow au lieu de DataGrid alors les en-têtes de ligne seront différents pour chaque ligne par exemple