.net - Usar IMultiValueConverter para pasar múltiples parámetros de comando a viewModel
wpf mvvm (1)
Tengo el siguiente código:
<DataGridTemplateColumn Header="Security">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Name="Security" Content="{Binding Path=totalSecurities}" Command="{Binding Source={StaticResource viewModel}, Path=filterGridCommand}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource PassThroughConverter}">
<Binding Path="sector"/>
<Binding ElementName="Security" Path="Name"/>
</MultiBinding>
</Button.CommandParameter>
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
A continuación se muestra el código para PassThroughConverter:
public class PassThroughConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameters, CultureInfo culture)
{
return values;
}
public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Cuando depuro tan pronto como llega a la línea de valores devueltos, los valores correctos están en la matriz, pero cuando presiono el botón que activa el comando filtergrid, ¿los valores devueltos son nulos? Alguien puede ayudar. Gracias.
Algunos experimentos confirman que al hacer esto
public object Convert(object[] values, Type targetType,
object parameters, CultureInfo culture)
{
return values;
}
da como resultado que el parámetro de comando termine como object[] { null, null }
.
El convertidor se ejecuta cada vez que cambia un valor vinculado, no cuando se ejecuta el comando, y el valor de retorno se almacena en caché para usarlo cuando se ejecuta el comando. Los valores del object[] values
parámetro original object[] values
parecen restablecerse a todos los object[] values
nulos.
La solución es clonar el parámetro de values
. En tu caso, puedes hacer esto:
public object Convert(object[] values, Type targetType,
object parameter, CultureInfo culture)
{
return new [] {values[0], values[1]};
}
Más útilmente, se puede manejar una cantidad variable de valores de la siguiente manera:
public object Convert(object[] values, Type targetType,
object parameter, CultureInfo culture)
{
return values.ToArray();
}