web-dev-qa-db-fra.com

WPF DataGrid RowHeader liaison de données

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?

29
eriksmith200

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.

33
markmuetz

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;
    }
}
5
denis morozov

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

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.

1
Bryan Johnson

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 .

0
user1680868

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

0
eriksmith200