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 コマンドをトリガーするボタンを押すと、返される値は両方とも null ですか? 誰でも助けることができます。ありがとうございました。

4

1 に答える 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();
}
于 2012-05-25T21:09:06.087 に答える