WPF MVVM : les Commandes sont faciles. Comment Connecter la Vue et ViewModel avec RoutedEvent
Supposons que j'ai une vue de mise en œuvre comme un DataTempate à l'intérieur d'un Dictionnaire de ressources.
Et j'ai un correspondant ViewModel.
La liaison Commandes sont faciles. Mais que faire si mon point de Vue contient un contrôle tel qu'une zone de liste, et j'ai besoin de Publier une application à l'échelle de l'événement (à l'Aide du Prisme de l'Événement Aggreagtor) basé sur l'Élément en cours de Changé sur la Liste.
si ListBox prend en charge une commande seulement je pouvais lier à une commande dans le ViewModel et de publier l'événement. Mais Listbox n'autorise pas une telle option.
Comment puis-je combler ce?
EDIT:
Beaucoup de grandes réponses.
Prendre un coup d'oeil à ce lien http://blogs.microsoft.co.il/blogs/tomershamam/archive/2009/04/14/wpf-commands-everywhere.aspx
Grâce
Ariel
OriginalL'auteur ArielBH | 2009-05-10
Vous devez vous connecter pour publier un commentaire.
Une option consiste à étendre le contrôle en question et ajouter le support pour la commande dont vous avez besoin. Par exemple, j'ai modifié liste avant de à l'appui de la
ItemActivated
de l'événement et de commandement.OriginalL'auteur Kent Boogaart
Au lieu d'essayer de lier une commande lorsque l'élément de changements, j'ai regardé le problème d'une autre manière.
Si vous liez l'élément sélectionné de la liste pour une propriété dans le ViewModel, puis lorsque cette propriété est modifiée, vous pouvez publier l'événement. De cette façon, le ViewModel reste la source de l'événement et il est déclenché par le point de changer, ce qui est ce que vous voulez.
...
Si la liaison ne pas être à 2 voies pour y parvenir? <ListBox ItemsSource="{Binding Articles}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />
Par défaut, les liaisons sur SelectedItem sont Bidirectionnels. Voir msdn.microsoft.com/en-us/library/...
OriginalL'auteur Cameron MacFarland
Étendre le contrôle à l'appui de ICommandSource et décider de l'action qui doit déclencher la commande.
Je l'ai fait avec la Boîte Combo et utilisé OnSelectionChanged comme le déclencheur de la commande. Je vais d'abord vous montrer en XAML comment je la lie de la commande à l'étendue du Contrôle zone de liste déroulante que j'ai appelé CommandComboBox, alors je vais vous montrer le code pour CommandComboBox qui ajoute le support pour le ICommandSource de zone de liste déroulante.
1) à l'Aide de CommandComboBox dans votre code XAML:
Dans votre espace de noms XAML déclarations comprennent
Utiliser le CommandComboBox en place de la zone de liste déroulante et lier la commande à elle de la sorte: Notez que dans cet exemple, j'ai défini une commande appelée SetLanguageCommand im mon ViewModel et je suis de passage de la valeur sélectionnée pour cette zone de liste déroulante en tant que paramètre à la commande.
2) Le code CommandComboBox
Le code pour le fichier CommandComboBox.cs est inclus ci-dessous. J'ai ajouté ce fichier dans une Bibliothèque de Classe appelé WpfCommandControlsLibrary et en a fait un projet à part donc je pourrais facilement ajouter n'importe étendre les commandes quelle que soit la solution nécessaire pour les utiliser, et donc je pourrais facilement ajouter d'autres Contrôles WPF et de les étendre à l'appui de la ICommandSource inteface.
OriginalL'auteur eesh
Une solution idéale pour ce type de problème vient de l'utilisation de Propriétés Attachées.
Marlon Grech a pris de l'utilisation de Propriétés Attachées à la prochaine en créant des Joint De Commande Comportements. À l'aide de ces indicateurs, il est possible de lier une Commande existante dans un ViewModel à un Événement existant dans la vue.
C'est quelque chose que j'utilise beaucoup de choses à régler des problèmes similaires avec des listes déroulantes, lorsque je veux les ouvrir, ou de modifier ou de faire une action sur un double-clic.
Dans cet exemple, je suis en utilisant une ancienne version de Joint de Commande Comportements, mais l'effet est le même. J'ai un style qui est utilisé pour ListBoxItems qui je suis explicitement d'incrustation.
Cependant, il serait assez facile de créer une application ou une fenêtre large de style s'appliquant à toutes les ListBoxItems qui définit les commandes à un niveau beaucoup plus élevé. Ensuite, chaque fois que l'événement pour la ListBoxItem attaché à la CommandBehavior.Propriété d'événement aurait le feu, au lieu de cela déclenche l'attaché de Commande.
OriginalL'auteur rmoore
Bien, personne n'a répondu.
J'ai donc renoncé et a déménagé à la mise en œuvre de la Vue sur l'extérieur, le Dictionnaire en un UserControl, j'ai injecté de lui une référence pour le ViewModel.
Maintenant, quand la ListBox feu de l'Événement qu'il appelle le ViewModel et à partir de là, tout est à nouveau possible.
Ariel
OriginalL'auteur ArielBH
J'ai écrit des comportements (des propriétés attachées) pour ce faire, et il y a encore des cas où j'ai besoin d'eux.
Pour le cas d'habitude cependant, il suffit de lier un événement à une commande, vous pouvez faire tout en Xaml si vous avez Blend SDK 4 installé. Notez que vous devez ajouter une référence à System.Windows.Interactivity.dll et de les redistribuer cette assemblée.
Cet exemple est l'invocation d'une ICommand DragEnterCommand sur le ViewModel lors de l'événement DragEnter de la Grille est tiré:
OriginalL'auteur Mike Fuchs
Essayez d'utiliser Prism 2.
Il est livré avec des extensions commandant et ouvre de nombreuses nouvelles posibilites (comme les commandes à être attaché à l'arbre visuel).
Prisme commandes contrôles cliquables seulement (héritée de ButtonBase), mais vous pouvez étendre les commandes par createing Commande personnalisée Comportements. Vous faites cela en héritant de CommandBhaviorBase<T> comme dans le code ci-dessous: public class ListBoxItemChangedCommandBehavior : CommandBehaviorBase<ListBox> { public ListBoxItemChangedCommandBehavior(contrôle ListBox) : base(contrôle) { contrôle.SelectedIndexChanged = OnSelectedIndexChanged; } private void OnSelectedIndexChanged(object sender, EventArgs e) { ExecuteCommand(); } }
OriginalL'auteur Jarek Kardas