2012-05-25 58 views
8

我有以下代码:使用IMultiValueConverter多个CommandParameters传递给视图模型

<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(); 
    } 
} 

当我尽快,因为它击中的返回值线调试,正确的值在数组 ,但是当我按下触发filtergridcommand的按钮时,返回的值都是null?任何人都可以帮忙谢谢。

回答

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