2012-05-25 5 views
8

У меня есть следующий код:Использование IMultiValueConverter передать несколько CommandParameters к 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> 

Ниже приведен код для 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(); 
    } 
} 

Когда я отладки, как только он попадает в возвращаемые значения строки , правильные значения находятся в массиве , но когда я нажимаю кнопку, которая запускает команду filtergrid, возвращаемые значения равны нулю? Может кто-нибудь помочь. Спасибо.

ответ

12

Некоторые эксперименты подтверждают, что делает этот

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

результатов в параметре команды в конечном итоге, как object[] { null, null }.

Преобразователь запускается каждый раз, когда значение привязки изменяется, а не когда команда выполняется, а возвращаемое значение кэшируется для использования при выполнении команды. Первоначальный параметр object[] values, по-видимому, сбрасывается ко всем нулям.

Решение заключается в клонировании параметра values. В вашем случае вы можете сделать это:

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

Более целесообразно, переменное число значений может быть обработан следующим образом:

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

спасибо Филу, что решить мою проблему! – bewilderedprogrammer