3 votes

Comment puis-je exécuter une action personnalisée sur les données d'une DataGridRow lorsqu'elle est sélectionnée ?

J'ai essayé de trouver comment intégrer ce comportement personnalisé dans un tableau de données sans trop chercher de solutions en ligne.

Étant donné la grille de données suivante (certains xaml ont été supprimés pour des raisons de brièveté) :

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn Width="auto">
            <DataGridTemplateColumn.HeaderTemplate>
                <DataTemplate>
                    <CheckBox />
                </DataTemplate>
            </DataGridTemplateColumn.HeaderTemplate>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding Selected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

J'ai la case à cocher liée avec succès à l'objet databound pour chaque ligne. (Remarque : j'utilise un objet DataGridTemplateColumn plutôt que DataGridCheckBoxColumn afin que vous n'ayez pas besoin de double-cliquer pour modifier la valeur).

Ce que je voudrais réaliser, c'est avoir la possibilité de cocher la case à cocher / mettre à jour la propriété Selected de l'objet databound lorsque l'utilisateur sélectionne une ligne. En fait, le clic sur toute la ligne active la propriété cochée de la case à cocher. Idéalement, j'aimerais faire cela sans fichier de code derrière si possible, car j'essaie de garder mon code derrière aussi propre que possible.

Une autre fonctionnalité que j'aimerais, si possible, serait que le fait de cliquer sur une ligne fasse basculer sa propriété sélectionnée de sorte que si vous cliquez sur une autre ligne, la précédente reste sélectionnée ainsi que la nouvelle.

Toute aide est la bienvenue.

1voto

Marc Points 4481

Pour plus de clarté. J'ai compris

Une autre fonctionnalité que j'aimerais, si possible, serait que une autre fonctionnalité que j'aimerais avoir, si possible, c'est qu'en cliquant sur une ligne, la propriété sélectionnée soit basculée de telle sorte que si vous sur une autre, la précédente reste sélectionnée ainsi que la nouvelle. nouvelle ligne.

de la même manière que vous voulez que la case à cocher d'un élément, respectivement le bouton Selected sur le ViewModel des éléments, pour qu'elle reste sélectionnée lorsque la ligne suivante de la grille de données est sélectionnée, mais pas la ligne de données elle-même ? Est-ce correct ?

Ma suggestion est d'étendre le comportement de votre DataGrid en utilisant * Comportement WPF *s ( Voici une bonne introduction . De cette façon, vous pouvez garder un code clair, mais vous n'avez pas besoin de tordre le XAML pour qu'il fasse ce que vous voulez.

C'est en gros l'idée des comportements : Écrire du code testable, qui n'est pas couplé à votre vue concrète, mais qui vous permet néanmoins d'écrire des choses compliquées dans du "vrai" code et non dans XAML. À mon avis, votre cas est une tâche typique pour les comportements.

Votre comportement pourrait être aussi simple que ceci.

public class CustomSelectionBehavior : Behavior<DataGrid>
{
    protected override void OnAttached()
    {
        // Set mode to single to be able to handle the cklicked item alone
        AssociatedObject.SelectionMode = DataGridSelectionMode.Single;
        AssociatedObject.SelectionChanged += AssociatedObject_SelectionChanged;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.SelectionChanged -= AssociatedObject_SelectionChanged;
    }

    private void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs args)
    {
        // Get DataContext of selected row
        var item = args.AddedItems.OfType<ItemViewModel>();

        // Toggle Selected property
        item.Selected = !item.Selected;
    }
}

L'attribution du comportement à votre DataGrid spécifique se fait en XAML :

<DataGrid ...>
    <i:Interaction.Behaviors>
        <b:CustomSelectionBehavior />
    </i:Interaction.Behaviors>
    ...
</DataGrid>

Vous devez faire référence

System.Windows.Interactivity.dll

qui contient le Behavior<T> ainsi que la classe de base.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X