Ich habe einen Befehl, den ich aus meiner XAML-Datei mit der folgenden Standardsyntax ausführe:
<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand}"/>
Dies funktionierte einwandfrei, bis mir klar wurde, dass ich ZWEI Informationen aus der Ansicht benötigte, um diesen Vorgang so auszuführen, wie es die Benutzer erwarten (insbesondere die Breite und Höhe der Leinwand).
Es scheint möglich zu sein, ein Array als Argument an meinen Befehl zu übergeben, aber ich sehe keine Möglichkeit, die Bindung an meine beiden Canvas-Eigenschaften im CommandParameter anzugeben:
<Button Content="Zoom"
Command="{Binding MyViewModel.ZoomCommand"
CommandParameter="{Binding ElementName=MyCanvas, Path=Width}"/>
Wie gebe ich sowohl Breite als auch Höhe an meinen Befehl weiter? Es scheint nicht möglich zu sein, dies mit Befehlen von XAML zu tun, und ich muss einen Klick-Handler in meinem Codebehind verkabeln, damit diese Informationen an meine Zoom-Methode übergeben werden.
Antworten:
Erstens, wenn Sie MVVM ausführen, stehen diese Informationen Ihrer VM normalerweise über separate Eigenschaften zur Verfügung, die an die Ansicht gebunden sind. Das erspart Ihnen die Übergabe von Parametern an Ihre Befehle.
Sie können jedoch auch mehrere Bindungen verwenden und einen Konverter verwenden, um die Parameter zu erstellen:
In Ihrem Konverter:
Dann in Ihrer Befehlsausführungslogik:
quelle
Im Konverter der ausgewählten Lösung sollten Sie Werte hinzufügen.Clone (), andernfalls enden die Parameter im Befehl end null
quelle
Verwenden Sie Tuple in Converter und wandeln Sie in OnExecute das Parameterobjekt zurück in Tuple.
quelle
Wenn Ihre Werte statisch sind, können Sie Folgendes verwenden
x:Array
:quelle
SystemColors
beispielsweise verwenden, sollten SieDynamicResource
stattdessen verwenden,StaticResource
da der Benutzer die Systemfarben während der Ausführung über die Systemsteuerung ändern kann. CanvasWidth
undHeight
sind keine Ressourcen und nicht statisch. Es gibt Instanzeigenschaften, die von geerbt wurdenFrameworkElement
.Bei der Verwendung von Tuple in Converter ist es besser, "Objekt" anstelle von "Zeichenfolge" zu verwenden, damit es für alle Objekttypen ohne Einschränkung des Objekts "Zeichenfolge" funktioniert.
Dann könnte die Ausführungslogik in Command so aussehen
und Multi-Bind mit Konverter, um die Parameter zu erstellen (mit zwei TextBox-Objekten)
quelle