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?

29
demandé sur eriksmith200 2011-01-25 12:45:33

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.

33
répondu markmuetz 2014-08-05 00:25:52

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;`
5
répondu denis morozov 2018-09-27 11:35:28

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>
2
répondu michele 2011-01-25 10:01:16

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.

1
répondu Bryan Johnson 2011-03-02 21:49:53

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

0
répondu eriksmith200 2011-01-25 12:47:48

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

0
répondu user1680868 2018-09-11 13:52:56