commands - wpf button command
Pasar dos parĂ¡metros de comando usando un enlace WPF (3)
En el convertidor de la solución elegida, debe agregar values.Clone () de lo contrario, los parámetros en el comando terminan nulos
public class YourConverter : IMultiValueConverter
{
public object Convert(object[] values, ...)
{
return values.Clone();
}
...
}
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 piezas de información de la vista para hacer que esta operación se completara de la manera esperada por los usuarios (el ancho y la altura del lienzo de forma específica).
Parece que es posible pasar una matriz como argumento a mi comando, pero no veo que haya una forma de especificar el enlace a mis dos propiedades de lienzo en el parámetro de comando:
<Button Content="Zoom"
Command="{Binding MyViewModel.ZoomCommand"
CommandParameter={Binding ElementName=MyCanvas, Path=Width}"/>
¿Cómo paso tanto ancho como alto a mi comando? No parece que esto sea posible usando comandos de XAML y necesito conectar un manejador de clics en mi código detrás para que esta información pase a mi método de zoom.
En primer lugar, si está haciendo MVVM, normalmente tendrá esta información disponible para su máquina virtual a través de propiedades separadas desde la vista. Eso le ahorra tener que pasar cualquier parámetro a sus comandos.
Sin embargo, también puedes vincular varias veces y usar un convertidor para crear los parámetros:
<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource YourConverter}">
<Binding Path="Width" ElementName="MyCanvas"/>
<Binding Path="Height" ElementName="MyCanvas"/>
</MultiBinding>
</Button.CommandParameter>
</Button>
En tu convertidor:
public class YourConverter : IMultiValueConverter
{
public object Convert(object[] values, ...)
{
return values.Clone();
}
...
}
Luego, en tu lógica de ejecución de comandos:
public void OnExecute(object parameter)
{
var values = (object[])parameter;
var width = (double)values[0];
var height = (double)values[1];
}
Utilice Tuple en el convertidor y, en OnExecute, vuelva a convertir el objeto del parámetro en Tuple.
public class YourConverter : IMultiValueConverter
{
public object Convert(object[] values, ...)
{
Tuple<string, string> tuple = new Tuple<string, string>(
(string)values[0], (string)values[1]);
return (object)tuple;
}
}
// ...
public void OnExecute(object parameter)
{
var param = (Tuple<string, string>) parameter;
}