2012-05-25 13 views
8

Ho il seguente codice:Utilizzando IMultiValueConverter passare più CommandParameters al 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> 

Di seguito è riportato il codice per 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(); 
    } 
} 

Quando il debug non appena colpisce la linea di valori di ritorno , i valori corretti sono nell'array ma quando preme il pulsante che attiva il comando filtergrid, i valori restituiti sono entrambi nulli? Qualcuno può aiutare. Grazie.

risposta

12

Alcuni sperimentazione conferma che facendo questo

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

risultati nel parametro di comando di finire come object[] { null, null }.

Il convertitore viene eseguito ogni volta che un valore associato cambia, non quando viene eseguito il comando e il valore di ritorno viene memorizzato nella cache per l'utilizzo quando viene eseguito il comando. Il parametro originale object[] values sembra essere resettato su tutti i null.

La soluzione è clonare il parametro values. Nel tuo caso si può fare questo:

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

Molto più utile, un numero variabile di valori può essere gestita in questo modo:

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

Grazie Phil, che ha risolto il mio problema! – bewilderedprogrammer

Problemi correlati