Tengo un comando que estoy ejecutando desde mi archivo XAML usando la siguiente sintaxis estándar:
<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand}"/>
Esto funcionó bien hasta que me di cuenta de que necesitaba DOS datos de la vista para que esta operación se completara de la manera que los usuarios esperan (el ancho y la altura del lienzo específicamente).
Parece que es posible pasar una matriz como argumento a mi comando, pero no veo que haya una manera de especificar el enlace a mis dos propiedades de lienzo en el CommandParameter:
<Button Content="Zoom"
Command="{Binding MyViewModel.ZoomCommand"
CommandParameter="{Binding ElementName=MyCanvas, Path=Width}"/>
¿Cómo paso ambos Anchura y Altura a mi comando? No parece que esto sea posible usando comandos de XAML y necesito conectar un controlador de clic en mi código detrás para que esta información pase a mi método de zoom.
Respuestas:
En primer lugar, si está haciendo MVVM, normalmente tendrá esta información disponible para su VM a través de propiedades separadas vinculadas desde la vista. Eso le ahorra tener que pasar cualquier parámetro a sus comandos.
Sin embargo, también podría hacer un enlace múltiple y usar un convertidor para crear los parámetros:
En tu convertidor:
Luego, en su lógica de ejecución de comando:
fuente
En el convertidor de la solución elegida, debe agregar valores. Clone () de lo contrario, los parámetros en el comando terminan nulo
fuente
Use Tuple en Converter, y en OnExecute, devuelva el objeto de parámetro a Tuple.
fuente
Si sus valores son estáticos, puede usar
x:Array
:fuente
SystemColors
por ejemplo, debe usar enDynamicResource
lugar deStaticResource
porque el usuario puede cambiar los colores del sistema a través del Panel de control durante la ejecución. CanvasWidth
yHeight
no son recursos y no son estáticos. Hay propiedades de instancia heredadas deFrameworkElement
.Sobre el uso de Tuple en Converter, sería mejor usar 'objeto' en lugar de 'cadena', de modo que funcione para todos los tipos de objetos sin limitación del objeto 'cadena'.
Entonces la lógica de ejecución en Command podría ser así
y enlace múltiple con convertidor para crear los parámetros (con dos objetos TextBox)
fuente