Sélectionner plusieurs éléments dans une grille de données dans un projet WPF MVVM
Comment puis-je sélectionner plusieurs éléments d'une DataGrid
dans un projet WPF MVVM?
Vous devez vous connecter pour publier un commentaire.
Comment puis-je sélectionner plusieurs éléments d'une DataGrid
dans un projet WPF MVVM?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez simplement ajouter un personnalisé propriété de dépendance pour ce faire:
Maintenant, vous pouvez utiliser cette
dataGrid
dans le code XAML:Mon
ViewModel
:Mon modèle:
Et enfin, voici le code derrière de
MainWindow
:J'espère que ce propre de conception MVVM aide.
PropertyMetadata
de la Propriété de Dépendance à inclure une fonction qui peut faire la comparaisonlocal:SelectedItems
donc je n'ai pas besoin de sous-classer laDataGrid
.this.SelectedItemsList = this.SelectedItems;
n'a pas fonctionné pour moi, en tant queSelectedItemsList
était toujours réglé ànull
. Toutefois, la modification du code deforeach (var item in this.SelectedItems) { this.SelectedItemsList.Add(item); }
a fait le tour. Veuillez noter que cela vous oblige à appelerthis.SelectedItemsList.Clear();
à l'avance, de sorte que les éléments deSelectedItemsList
n'obtiendrez pas dupliqué.Ce que je voudrais faire est de créer
Behaviors
à l'aide deSystem.Windows.Interactivity
. Vous devez le référencer manuellement dans votre projet.Donné un contrôle qui permet de ne pas exposer
SelectedItems
par exemple, (ListBox, DataGrid)Vous pouvez créer un comportement de classe à quelque chose comme ceci
Et sur votre
XAML
je voudrais faire leBinding
comme ça oùi
estxmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
etbehaviors
est l'espace de noms de votreBehavior
classeEn supposant que votre
DataContext
pour laListBox
a laSelectedItems
propriété dans leViewModel
alors il sera automatiquement mise à jour leSelectedItems
. Vous avez encapsulé laevent
vous abonnant à partir de laView
c'est à dire,Vous pouvez modifier la
Behavior
classe pour être de typeDataGrid
si vous le souhaitez.DataGrid
A unSelectedItems
bien, mais ce n'est pas une propriété de dépendance si la liaison ne fonctionne pas. > ne pas exposerSelectedItems
est une fausse déclaration.SelectedItems
est de typeIEnumerable
j'ai aussi eunull
. Mais dès que le type a été changé pourIList
les données proviennent. Malheureusement, la Liaison n'a pas été vraiment Bidirectionnels. La solution est une combinaison entre cette réponse et cette entrée de blogJe utiliser cette solution dans mon application:
XAML:
au-dessus de vous fichier xaml, ajoutez cette ligne de code:
SelectedItemsCommand est de type ICommand qui est écrit dans le viewmodel.
Utilisé DLL:
System.Windows.Interactivity.dll
Avec la valeur par défaut
DataGrid
de WPF, il n'est pas possible d'utiliser une Liaison, comme il est possible avec leSelectedItem
-Propriété, la cause de laSelectedItems
-Propriété n'est pas une DependencyProperty.D'une façon à ce que vous voulez faire est de vous inscrire à la
SelectionChanged
-Cas de la grille de données pour mettre à jour la propriété du ViewModel, qui stocke les éléments sélectionnés.La propriété SelectedItems de la grille de données est de type IList si vous avez besoin de jeter les éléments dans la liste pour votre type spécifique.
C#
XAML
SelectedItems
de la propriété dans le code XAML.Vous pouvez ajouter le "IsSelected" propriété dans le Modèle et ajouter une case à cocher dans la ligne.
Vous pouvez maka un génériques réutilisables classe de base. De cette façon, vous pouvez sélectionner des lignes à la fois à partir du code et de l'INTERFACE utilisateur.
C'est ma classe d'exemple je veux être sélectionnable
Génériques de la classe de base pour sélectionnable classes. INotifyPropertyChanged permet de l'INTERFACE utilisateur mise à jour lorsque vous définissez IsSelected.
Créer sélectionnable classe
Créer une propriété de se lier à
Ensemble propety
Lier à datagrid et ajouter un style à la DataGridRow qui se lie à la IsSelected propety sur le MySelectedItem
Pour obtenir des lignes sélectionnées/articles
Pour sélectionner les lignes ou les éléments
Edit--->
Il semble que cela ne fonctionne pas lorsque EnableRowVirtualization est vrai
WPF DataGrid permet de faire cela.
Il suffit de fixer la grille de données.Les lignes.SelectionMode et DataGrid.Les lignes.SelectionUnit pour "Extended" et "CellOrRowHeader", respectivement. Cela peut être fait dans le Mélange, comme indiqué dans l'image que j'en ai compris. Cela permettra à l'utilisateur de sélectionner chaque cellule, des rangées entières etc. autant qu'ils le souhaitent, en utilisant la touche maj ou la touche ctrl pour sélectionner de.
Le projet, je travaille sur les utilisations MVVM Light et j'ai trouvé ce blog
post être la solution la plus simple. Je le répète, la solution ici:
Modèle De Vue:
XAML: