Obtenir WPE ListView.SelectedItems dans ViewModel
Il y a certains postes de discuter de l'ajout de données-capacité de liaison pour ListView.SelectedItems
avec montant non négligeable de code. Dans mon scénario je n'ai pas besoin de la définir à partir de la ViewModel
juste obtenir les éléments sélectionnés dans le but de réaliser une action et il est déclenché par la commande afin de pousser la mise à jour est également pas nécessaire.
Est-il une solution simple (en termes de lignes de code), peut-être dans le code-behind? Je suis fine avec le code-behind tant que View
et ViewModel
n'avez pas besoin de référence les uns des autres. Je pense que c'est une question générique: "les meilleures pratiques pour les VM pour obtenir des données à partir de la Vue sur la demande", mais je n'arrive pas à trouver quoi que ce soit...
source d'informationauteur NS.X.
Vous devez vous connecter pour publier un commentaire.
Pour obtenir le
SelectedItems
seulement lorsqu'une commande est exécutée, puis utiliserCommandParameter
et passer dans leListView.SelectedItems
.Ceci peut être réalisé à l'aide de l'Interaction déclenche comme ci-dessous
Vous devez ajouter une référence à
Microsoft.De l'Expression.Interactions
Système.De Windows.L'interactivité
Ajouter ci-dessous les xmlns à votre xaml
Ajoutez le code ci-dessous juste à l'intérieur de votre GridView tag
Code à l'Intérieur ViewModel déclarer la propriété ci-dessous
dans le constructeur du Viewmodel initialiser Commande comme ci-dessous
Je peux vous l'assurer: SelectedItems est en effet bindable comme XAML CommandParameter
Après beaucoup de creuser et de recherches sur google, j'ai enfin trouvé une solution simple à ce problème commun.
Pour le faire fonctionner, vous devez suivre TOUTES les règles suivantes:
Suivantes Ed de la Balle suggestion", sur vous XAML de commande de liaison de données, de définir CommandParameter bien AVANT Commande de la propriété. Cette très longue bug.
Assurez-vous que votre ICommand's CanExecute et Exécuter méthodes ont un paramètre de objet type. De cette façon, vous pouvez éviter silence fonte des exceptions qui se produit chaque fois que la liaison de données CommandParameter type ne correspond pas à votre commande des paramètres de type.
Par exemple, vous pouvez soit envoyer un listview/listbox est SelectedItems bien à vous ICommand de méthodes ou de la liste/listbox de soi. Grande, n'est-ce pas?
Espère qu'il empêche quelqu'un de dépenser de l'énorme quantité de temps que j'ai fait pour comprendre comment recevoir SelectedItems comme CanExecute paramètre.
Je ne pense pas que c'est correct condition de considérer que " Vue et ViewModel n'avez pas besoin de connaître les uns les autres'; Dans MVVM vue de toujours savoir à propos de ViewModel.
J'ai aussi rencontré ce genre de situation où j'ai eu accès à ViewModel dans la vue de code derrière, puis de renseigner certaines données(comme les éléments sélectionnés), cela devient nécessaire lors de l'utilisation 3'rd partie de contrôles ListView, DataGrid, etc.
Si directement de liaison de la machine virtuelle de la propriété n'est pas possible, alors je voudrais écouter de la ListViw.SelectionChanged événement, puis mettre à jour mon Viewmodel SelectedItems de la propriété, dans ce cas.
Mise à jour:
Pour activer VM extraire des données à partir d'une vue, Vous pouvez présenter une interface sur le point de Vue qui traite de la Vue spécifique de fonctionnalité et de ViewModel aura de référence de votre point de Vue par le biais de l'interface; l'Aide d'une interface conserve encore la Vue et ViewModel largement découplée mais je genrally ne préfère pas.
MVVM, en fournissant de l'Association de Vue à ViewModel
Je préfère encore l'approche de la manipulation de l'événement dans la Vue, et garder la VM à jour(avec les éléments sélectionnés), de cette façon, VM n'avez pas besoin de vous soucier d'extraire les données avant d'effectuer toute opération, il a juste besoin d'utiliser les données disponibles(qui sera toujours mis à jour).
Car aucune des autres réponses m'ont aidé (à l'aide de
SelectedItems
commeCommandParameter
a toujours éténull
), voici une solution Universelle pour la Plate-forme Windows (UWP) des applications. Il fonctionne à l'aide deMicrosoft.Xaml.Interactivity
etMicrosoft.Xaml.Interactions.Core
.Voici la Vue:
Voici le ViewModel (
RelayCommand
est une classe de MVVM Light):Attention, si vous allez supprimer des éléments de la collection d'origine après la sélection est terminée (l'utilisateur appuie sur un bouton, etc.), il va également supprimer les éléments de votre
_selectedItems
liste! Si vous le faites dans une boucle foreach, vous aurez uneInvalidOperationException
. Pour éviter cela, il suffit d'ajouter un garde dans le lieu marqué comme:et ensuite, dans la méthode où vous, par exemple de supprimer les éléments, faire ceci: