8

我有以下代码:

<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 命令的按钮时,返回的值都是空的?任何人都可以帮忙。谢谢你。

4

1 回答 1

13

一些实验证实这样做

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]};
}

More usefully, a variable number of values can be handled like this:

public object Convert(object[] values, Type targetType, 
                      object parameter, CultureInfo culture)
{
    return values.ToArray();
}
于 2012-05-25T21:09:06.087 回答