Case avec DataGrid WPF
Je suis en train de créer un DataGrid dans WPF 4.0 à l'aide de MVVM...
Fonctionnalités requises -
- Muti - Sélectionner les lignes à l'aide d'une case à cocher (simple clic)
- Tout sélectionner la case à cocher toutes les cases dans la grille de données
Quelque chose comme cela -
Il a été de 2 jours et je ne suis pas en mesure de comprendre comment résoudre le problème de manière efficace..
Un exemple de travail est ce dont j'ai besoin maintenant ASAP..
Je vais très reconnaissant si quelqu'un a une solution de travail à partager avec moi...
N s'il vous plaît ne me dites pas de google cette chose parce que rien de ce fonctionné pour moi...
Mise à JOUR -
- Je suis en utilisant AutoGeneration de Colonnes
- Je ne veux pas ajouter "IsSelected" ou de l'une de ces biens dans mon MODÈLE..
- Je suis juste face à 2 problèmes -
Tout d'abord, "Sélectionner tout" Fonctionnalité à savoir la vérification de toutes les cases à cocher sur la case de cliquer sur celui qui est présent dans l'en-tête de colonne...(je suis en mesure de sélectionner et de désélectionner la grille de données, mais pas en mesure de cocher/décocher les cases à cocher)
Deuxièmement, la sélection Multiple sur clic de souris, sans maintenir la Touche Ctrl enfoncée..
CheckBox
dans l'en-tête? Rendant cochez/décochez les cases?D'abord google hit: here. Mec, sérieusement. J'ai tendance à fournir de travail complète des échantillons ici dans Stackoverflow, mais votre manque d'intérêt est donc évident que je ne vais pas répondre à cette question.
HighCore - ce que je pourrais avoir atteint en 5 minutes sans googler la merde! 1. Je suis à l'aide de AutoGeneration de 2 Colonnes. Je ne veux pas ajouter "IsSelected" ou de l'une de ces biens dans mon MODÈLE.. 3. Je suis juste face à 2 problèmes tout d'Abord, "Sélectionner tout" Fonctionnalité à savoir la vérification de toutes les cases à cocher sur la case de cliquer sur celui qui est présent dans l'en-tête de colonne... Deuxièmement, la sélection Multiple sur clic de souris, sans maintenir la Touche Ctrl enfoncée..
OriginalL'auteur Rajat Suneja | 2013-06-14
Vous devez vous connecter pour publier un commentaire.
Lorsque vous travaillez avec MVVM, vous devez être conscient de ce qui est considéré comme des données et de ce qui est strictement de l'INTERFACE utilisateur.
Est votre
SelectedItems
va être une partie de vos données, ou seulement votre INTERFACE utilisateur?Si c'est une partie de vos données, vous devriez vraiment avoir une
IsSelected
de propriété sur votre modèle de données, même si cela signifie que l'extension de la classe de données pour inclure uneIsSelected
de la propriété, ou la création d'une classe wrapper qui ne contient quebool IsSelected
etobject MyDataItem
. La première option est probablement préférable, car vous pourriez garderAutoGenerateColumns="True"
, et il rend les liaisons de colonne plus simple.Alors vous lier votre
DataGridRow.SelectedItem
à laIsSelected
propriété de l'élément de données:Mais si votre
SelectedItems
est uniquement pour l'INTERFACE utilisateur, ou si vous êtes en rupture le modèle MVVM pour une raison quelconque, dans ce cas, que vous pouvez créer indépendantCheckBox
et l'utilisation du code derrière pour assurer laCheckBox
est correctement synchronisée à laSelectedItem
.J'ai fait un rapide exemple d'application, et voici ce que mon code ressemblait:
Tout d'abord, j'ai juste ajouté le unbound
CheckBox
colonne de la liste des colonnes à l'aide d'unDataGridTemplateColumn
. Ce sera ajouté avant leAutoGenerateColumns
liste de colonnes.Deuxième, j'ai ajouté un
PreviewMouseDown
événement à laCheckBox
à faire de l'ensemble de laIsSelected
propriété de la ligne.Il a besoin pour naviguer dans le
VisualTree
pour trouver leDataGridRow
associés à l'cliquéCheckBox
pour le sélectionner, et à rendre la vie plus facile, je suis en utilisant certains personnalisée VisualTreeHelpers que j'ai sur mon blog pour trouver leDataGridRow
. Vous pouvez utiliser le même code, ou vous pouvez créer votre propre méthode pour la recherche de laVisualTree
.Et le dernier de tous, si l'utilisateur clique sur un endroit autre que le
CheckBox
, nous voulons désactiver par défautDataGrid
événement de sélection. Cela garantit que leIsSelected
valeur ne changera que lorsque vous cliquez sur leCheckBox
.Il y a plusieurs façons de faire qui permet de désactiver la sélection à différents niveaux, mais pour rendre la vie simple, j'ai juste désactivé le
DataGrid.PreviewMouseLeftButtonDown
cas si l'utilisateur n'a pas cliqué sur leCheckBox
.Je l'aide de mon custom VisualTreeHelpers de nouveau pour naviguer dans l'arborescence visuelle et de découvrir si la Case sur laquelle vous avez cliqué, et à l'annulation de l'événement, si l'utilisateur a cliqué sur un autre endroit que le
CheckBox
.Comme pour votre 2ème demande d'ajout d'un
CheckBox
àSelectAll
ouUnselectAll
éléments, ce serait une fois de plus être dépendant si votre sélection est la partie de l'INTERFACE utilisateur ou les données.Si c'est une partie de l'INTERFACE utilisateur, il suffit d'ajouter un
CheckBox
à laDataGridTemplateColumn.HeaderTemplate
, et quand il est cliqué, une boucle par laDataGrid.Rows
, trouver leCheckBox
dans la première colonne, puis cochez ou décochez la case.Si c'est une partie des données, vous pouvez toujours faire la même chose (seulement la valeur liée à la
DataGrid.Items
au lieu de laCheckBox.IsChecked
de laDataGrid.Rows
), ou vous pouvez faire comme Adolfo Perez a suggéré, et le lier à une propriété sur laViewModel
.J'ai été aux prises avec ce pour un bon moment, que nous allons créer notre DataGridTemplateColumns par programmation. Enfin, votre impl de PreviewMouseLeftButtonDown gestionnaire semble fonctionner, attaché à la Case comme ceci:
checkBoxFactory.AddHandler(PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(ChkBox_PreviewMouseLeftButtonDown));
OriginalL'auteur Rachel
Pour un MVVM Solution, vous pouvez essayer ce:
Dans votre
ViewModel
:Et, enfin, l'exemple de la classe du Modèle:
La plupart du code ci-dessus doivent être explicites, mais si vous avez des questions laissez-moi savoir
OriginalL'auteur Adolfo Perez
Votre point de vue peut être quelque chose comme
Et dans le viewmodel
SomeCollection propriété de liaison est une observablecollection
sometype contient des propriétés comme IsSelected , RandomNumber ,la Date , l'Heure
pour exemple:
OriginalL'auteur srsyogesh