2012-05-25 14 views
8

Tengo el siguiente código:Usando IMultiValueConverter pasar múltiples CommandParameters a viewmodel

<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 elimino errores tan pronto como llega a la línea de valores de retorno , los valores correctos están en la matriz pero cuando presiono el botón que desencadena el filtrogridcommand, los valores devueltos son ambos nulos? Alguien puede ayudar. Gracias.

Respuesta

12

algunos experimentos confirman que esta haciendo

public object Convert(object[] values, Type targetType, 
         object parameters, CultureInfo culture) 
{ 
    return values; 
} 

resultados en el parámetro de comando terminando 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. El parámetro original object[] values parece restablecerse a todos los valores nulos.

La solución es clonar el parámetro values. En su caso, usted puede hacer esto:

public object Convert(object[] values, Type targetType, 
         object parameter, CultureInfo culture) 
{ 
    return new [] {values[0], values[1]}; 
} 

Más útilmente, un número variable de valores puede ser manejado de esta manera:

public object Convert(object[] values, Type targetType, 
         object parameter, CultureInfo culture) 
{ 
    return values.ToArray(); 
} 
+0

Gracias Phil, que resolvió mi problema! – bewilderedprogrammer

Cuestiones relacionadas