使用 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>

下面是直通转换器的代码:

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 的按钮时,返回的值都是空的?谁能帮忙。谢谢。

一些实验证实这样做

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

相关内容

  • 没有找到相关文章

最新更新