Comment lier plusieurs choix de listview viewmodel?
Je suis la mise en œuvre d'un contrôle listview, et un bouton à côté de lui. J'ai de pouvoir que lorsque je sélectionne plusieurs éléments dans une liste, puis cliquez sur un bouton, puis les éléments sélectionnés sont mis dans une liste. Mais ma question est , comment puis-je lier les éléments sélectionnés vers le viewmodel?
J'ai changé mon selectionmode à plusieurs. Mais alors, dois-je faire:
SelectedItem={Binding path= selectedItems}
puis faire dans mon viewmodel une propriété selectedItems, et il sera mis ces articles que j'ai sélectionné? Ou quelle est la bonne solution pour ce faire?
Vous devez vous connecter pour publier un commentaire.
Ce que vous pouvez faire est que vous pouvez gérer le Button_Click(...) dans votre code-behind. Puis dans le code-behind de la méthode, vous pouvez créer une Liste des éléments sélectionnés par l'itération sur les éléments sélectionnés de la liste.
Depuis qu'il est autorisé à accéder au ViewModel de la Vue, vous pouvez maintenant appeler une méthode sur votre ViewModel et transmettre la liste des éléments sélectionnés en tant que paramètre.
Je ne sais pas si ce serait aussi travailler avec les Liaisons uniquement, mais il n'est pas une mauvaise pratique de l'utilisation de code-behind ainsi.
Exemple De Code:
MODIFIER
Ici est un minimaliste exemple, XAML:
CODE-BEHIND:
Comme Médecin l'a déjà souligné, vous pouvez lier SelectedItems à 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.
C'est le genre de difficile à faire cet Exerciseur Sélection de MVVM, parce que le
SelectedItems
propriété n'est pas unDependency Property
. Cependant, il existe quelques astuces que vous pouvez utiliser. J'ai trouvé ce triology de blogs qui décrivent le sujet dans quelques détails et de fournir des solutions utiles.Espère que cette aide
Si vous utilisez le Système.De Windows.L'interactivité et Microsoft.De l'Expression.Interactions déjà, voici une solution de contournement, sans aucune autre code de comportement pour déconner. Si vous avez besoin, il peut être télécharger à partir de ici
Cette solution de contournement faire usage de l'interactivité de l'événement de déclenchement et les interactions de l'ensemble de la propriété mécanisme ci-dessus assemblées.
Supplémentaire de déclaration d'espace de noms dans le code XAML
XAML:
Modèle De Vue:
Dans l'exemple ci-dessus, votre ViewModel ramasser les éléments sélectionnés chaque fois que la sélection sur la ListView changé.
Malheureusement, le SelectedItems est en lecture seule ne peut être liée à la propriété.
J'ai trouvé beaucoup d'aide de cet article Comment Databind à un SelectedItems propriété dans WPF
Vous ne pouvez pas lier, mais vous pouvez envoyer à la Commande comme CommandParameter.
Si vous utilisez
Metro/WinRT
vous pouvez regarder le WinRTXXAMLToolkit car il offre une bindableSelectedItems
propriété de dépendance comme l'une de ses extensions.J'ai une solution pour cela, pour moi, cela a été assez simple.
Puis dans le viewmodel:
SelectedModels est la liste où je voulais la sélection doit être rempli.
Comme une légère variation sur le Christian post, j'ai mis en place un code similaire à l'aide de la ListView.SelectionChanged événement. Au lieu d'appeler une méthode sur le ViewModel, j'ai mis une propriété appelée SelectedItems:
De cette façon, ViewModel.SelectedItems est disponible pour toute commande que vous pourriez avoir dans votre ViewModel et il peut être utilisé pour la liaison de données (si vous le mettez dans une ObservableCollection).