J'ai une commande que j'exécute à partir de mon fichier XAML en utilisant la syntaxe standard suivante:
<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand}"/>
Cela a bien fonctionné jusqu'à ce que je réalise que j'avais besoin de DEUX informations de la vue afin de rendre cette opération complète comme les utilisateurs l'attendent (la largeur et la hauteur de la toile en particulier).
Il semble qu'il soit possible de passer un tableau en tant qu'argument à ma commande, mais je ne vois pas de moyen de spécifier la liaison à mes deux propriétés de canevas dans le CommandParameter:
<Button Content="Zoom"
Command="{Binding MyViewModel.ZoomCommand"
CommandParameter="{Binding ElementName=MyCanvas, Path=Width}"/>
Comment transmettre la largeur et la hauteur à ma commande? Il ne semble pas que cela soit possible en utilisant des commandes de XAML et je dois câbler un gestionnaire de clics dans mon codebehind pour que ces informations soient transmises à ma méthode de zoom.
Réponses:
Premièrement, si vous utilisez MVVM, ces informations sont généralement disponibles pour votre machine virtuelle via des propriétés distinctes liées à la vue. Cela vous évite de devoir passer des paramètres à vos commandes.
Cependant, vous pouvez également effectuer plusieurs liaisons et utiliser un convertisseur pour créer les paramètres:
Dans votre convertisseur:
Ensuite, dans votre logique d'exécution de commande:
la source
Dans le convertisseur de la solution choisie, vous devez ajouter des valeurs .Clone () sinon les paramètres de la commande se terminent par null
la source
Utilisez Tuple dans Converter et dans OnExecute, transtypez l'objet de paramètre en Tuple.
la source
Si vos valeurs sont statiques, vous pouvez utiliser
x:Array
:la source
SystemColors
par exemple, vous devez utiliser à laDynamicResource
place deStaticResource
car l'utilisateur peut modifier les couleurs du système via le Panneau de configuration pendant l'exécution. CanvasWidth
etHeight
ne sont pas des ressources et ne sont pas statiques. Il existe des propriétés d'instance héritées deFrameworkElement
.À propos de l'utilisation de Tuple dans Converter, il serait préférable d'utiliser «objet» au lieu de «chaîne», afin qu'il fonctionne pour tous les types d'objets sans limitation d'objet «chaîne».
Ensuite, la logique d'exécution dans Command pourrait être comme ça
et multi-bind avec convertisseur pour créer les paramètres (avec deux objets TextBox)
la source