WPF Événement de Liaison à ViewModel (pour les non-classes de commandes)
Je suis en train de travailler une deuxième version d'une application, et dans le cadre de la réécriture, je dois passer à une architecture MVVM. Je suis de pression à mettre absolument tous les bits de code dans le modèle de vue de classe, ayant c# dans le fichier code-behind, c'est mal vu. (Je sais, je sais...je comprends que le code derrière n'est pas une mauvaise chose, mais ce n'est pas mon appel de ce temps).
Pour les objets qui implémentent l'interface de commande, c'est facile. J'ai été en mesure de trouver une tonne d'informations sur la façon de lier la Commande de ces objets à un ICommand dans le modèle de vue. Le problème est que pour les objets qui n'ont pas cette interface, par exemple
<ListBox
x:Name="myListBox"
MouseDoubleClick="myCallbackFunction">
<!-- ... -->
</ListBox>
Je veux savoir comment faire pour lier les MouseDoubleClick cas de la zone de liste à myCallbackFunction, qui est mis en œuvre dans le modèle de vue. Est-ce même possible?
Merci!
- Double question stackoverflow.com/questions/939388/binding-commands-to-events
- Double Possible de Liaison des Commandes à des Événements?
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas possible directement. Il pourrait être fait par l'intermédiaire d'un Joint de Propriété ou de Comportement, mais ce serait toujours un peu difficile à trouver et appeler la méthode appropriée (ce qui peut être fait par le biais de la Réflexion assez facilement).
Cela étant dit, cela est généralement traitée par
ICommand
- Par exemple, MVVM Light a une grande EventToCommand comportement à la carte tout cas pour un ICommand dans le ViewModel. L'avantage de l'utilisation de ICommand est que vous pouvez toujours utiliser la liaison de données, depuis la ICommand est exposé comme une propriété.Pour répondre directement à votre question, veuillez vous référer à Pourquoi faut-il éviter le codebehind dans WPF MVVM modèle? Il suggère deux choses que vous voulez.
Cependant, pourquoi voulez-vous lier la MouseDoubleClick de la zone de liste pour votre ICommand dans le viewmodel?
La voie alternative est que vous écrivez une méthode dans le code-behind pour enregistrer le MouseDoubleClick. Il n'est pas mauvais en raison de faits suivants.
L'importance de la liaison de données est l'interaction entre une vue et un viewmodel. Par exemple, lorsqu'un utilisateur de saisir du texte à une zone de texte, un viewmodel est également mis à jour. Au contraire, si un viewmodel récupère les données d'une base de données, il sera indiqué lors d'un point de vue. Cependant, il n'est pas ce cas que la ICommand dans votre dernier se lie à la vue.
Bien sûr, la CanExcute de la ICommand serait important de votre viewmodel, mais dans de nombreux cas, il n'est pas lié avec le viewmodel ou pas concernés. Dans ce cas, la différence entre le ICommand de liaison et de l'écriture du code-behind est où le MouseDoubleClick événement est lié avec un ICommand ou enregistré auprès d'un gestionnaire d'événement.
WPF prend en charge les extensions de balisage sur les événements comme des .NET 4.5. En utilisant cette capacité, j'ai mis en place une incroyablement polyvalent méthode de liaison de l'extension et écrit à ce sujet ici:
http://www.singulink.com/CodeIndex/post/building-the-ultimate-wpf-event-method-binding-extension
Peut être utilisé pour lier une méthode à l'aide de la pleine propriété du chemin de la syntaxe, prend en charge les liaisons et les autres extensions de balisage comme arguments, et achemine automatiquement à la méthode qui correspond à la signature des arguments fournis. Voici quelques exemples d'utilisation:
Modèle de vue signatures de méthode:
Une façon peut être de gérer l'événement dans le code-behind et d'appeler la méthode la plus appropriée de vue du modèle de code derrière
Vous pouvez aussi aller pour certains prêts commandant de la bibliothèque comme cette didacticiel qui est à l'aide de ACB