Mam polecenie, które wykonuję z mojego pliku XAML przy użyciu następującej standardowej składni:
<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand}"/>
To działało dobrze, dopóki nie zdałem sobie sprawy, że potrzebuję DWÓCH informacji z widoku, aby ta operacja zakończyła się zgodnie z oczekiwaniami użytkowników (w szczególności szerokość i wysokość płótna).
Wygląda na to, że możliwe jest przekazanie tablicy jako argumentu do mojego polecenia, ale nie widzę sposobu na określenie powiązania z moimi dwoma właściwościami płótna w CommandParameter:
<Button Content="Zoom"
Command="{Binding MyViewModel.ZoomCommand"
CommandParameter="{Binding ElementName=MyCanvas, Path=Width}"/>
Jak przekazać do polecenia zarówno szerokość, jak i wysokość? Wydaje się, że nie jest to możliwe przy użyciu poleceń z XAML i muszę połączyć procedurę obsługi kliknięć w moim za kodem, aby uzyskać te informacje, które zostaną przekazane do mojej metody powiększania.
Odpowiedzi:
Po pierwsze, jeśli robisz MVVM, zazwyczaj te informacje są dostępne dla maszyny wirtualnej za pośrednictwem oddzielnych właściwości powiązanych z widokiem. Dzięki temu nie musisz przekazywać żadnych parametrów do swoich poleceń.
Możesz jednak również połączyć multi-bind i użyć konwertera do utworzenia parametrów:
W twoim konwerterze:
Następnie w logice wykonywania poleceń:
źródło
W konwerterze wybranego rozwiązania należy dodać wartości, Clone () w przeciwnym razie parametry w poleceniu kończą się null
źródło
Użyj Tuple w Converter, aw OnExecute rzutuj obiekt parametru z powrotem na Tuple.
źródło
Jeśli twoje wartości są statyczne, możesz użyć
x:Array
:źródło
SystemColors
na przykład, powinieneś użyćDynamicResource
zamiast,StaticResource
ponieważ użytkownik może zmieniać kolory systemowe za pośrednictwem Panelu sterowania podczas wykonywania. CanvasWidth
iHeight
nie są zasobami i nie są statyczne. Istnieją właściwości instancji dziedziczone zFrameworkElement
.Jeśli chodzi o używanie krotki w konwerterze, lepiej byłoby użyć wyrażenia „object” zamiast „string”, aby działało to dla wszystkich typów obiektów bez ograniczenia obiektu „string”.
Wtedy logika wykonania w Command mogłaby wyglądać następująco
i multi-bind z konwerterem do tworzenia parametrów (z dwoma obiektami TextBox)
źródło