У меня есть команда, которую я выполняю из моего файла XAML, используя следующий стандартный синтаксис:
<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand}"/>
Это работало нормально, пока я не понял, что мне нужно ДВА фрагмента информации из представления, чтобы эта операция завершилась так, как ожидают пользователи (в частности, ширина и высота холста).
Кажется, что возможно передать массив в качестве аргумента моей команде, но я не вижу способа указать привязку к двум моим свойствам холста в CommandParameter:
<Button Content="Zoom"
Command="{Binding MyViewModel.ZoomCommand"
CommandParameter="{Binding ElementName=MyCanvas, Path=Width}"/>
Как передать ширину и высоту моей команде? Не похоже, что это возможно при использовании команд из XAML, и мне нужно подключить обработчик щелчков в моем коде, чтобы эта информация передавалась моему методу масштабирования.
Ответы:
Во-первых, если вы работаете с MVVM, эта информация обычно доступна для вашей виртуальной машины через отдельные свойства, связанные с представлением. Это избавляет вас от необходимости передавать какие-либо параметры вашим командам.
Тем не менее, вы также можете использовать несколько связей и использовать конвертер для создания параметров:
В вашем конвертере:
Затем в вашей логике выполнения команды:
источник
В конвертере выбранного решения вы должны добавить values.Clone (), иначе параметры в команде end null
источник
Используйте Tuple в Converter и в OnExecute приведите объект параметра обратно в Tuple.
источник
Если ваши значения статичны, вы можете использовать
x:Array
:источник
SystemColors
например, вы должны использоватьDynamicResource
вместо,StaticResource
потому что пользователь может изменить системные цвета через панель управления во время выполнения. ХолстWidth
иHeight
не являются ресурсами и не являются статичными. Есть свойства экземпляра, унаследованные отFrameworkElement
.Что касается использования Tuple в Converter, было бы лучше использовать «объект» вместо «строка», чтобы он работал для всех типов объектов без ограничения объекта «строка».
Тогда логика выполнения в Command может быть такой
и multi-bind с конвертером для создания параметров (с двумя объектами TextBox)
источник