使用IMultiValueConverter将多个命令参数传递给viewModel

8

I have the following code:

<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的按钮时,返回的值都为空?有人能帮忙吗?谢谢。
1个回答

13

经过一些实验确认,这样做是可以的。

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

该命令参数的结果为 object[] { null, null }

转换器在绑定值更改时每次运行,而不是执行命令时运行,并且返回值被缓存以供执行命令时使用。原始参数 object[] values 看起来被重置为全部为 null。

解决方案是克隆 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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接