1. ホーム
  2. wpf

[解決済み] WPFバインディングを使用して2つのコマンドパラメータを渡す

2022-04-24 13:13:56

質問

以下の標準的な構文を使用して、XAMLファイルから実行するコマンドがあります。

<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand}"/>

これは、この操作をユーザーの期待通りに完了させるためには、ビューから 2 つの情報 (具体的にはキャンバスの幅と高さ) が必要であることに気づくまではうまくいっていました。

コマンドの引数に配列を渡すことは可能なようですが、CommandParameterに2つのcanvasプロパティへのバインドを指定する方法はないようですね。

<Button Content="Zoom" 
        Command="{Binding MyViewModel.ZoomCommand" 
        CommandParameter="{Binding ElementName=MyCanvas, Path=Width}"/>

幅と高さの両方をコマンドに渡すにはどうすればよいですか? これは、XAMLからコマンドを使用して可能であるようには思えませんし、私のcodebehindでクリックハンドラを配線して、ズームメソッドに渡すこの情報を取得する必要があります。

解決方法は?

まず、MVVMを使用している場合、通常、ビューからバインドされた別のプロパティを介して、この情報をVMで利用できるようにします。これにより、コマンドにパラメータを渡す手間を省くことができます。

しかし、マルチバインドして、コンバーターを使用してパラメータを作成することもできます。

<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand">
    <Button.CommandParameter>
        <MultiBinding Converter="{StaticResource YourConverter}">
             <Binding Path="Width" ElementName="MyCanvas"/>
             <Binding Path="Height" ElementName="MyCanvas"/>
        </MultiBinding>
    </Button.CommandParameter>
</Button>

コンバーターで

public class YourConverter : IMultiValueConverter
{
    public object Convert(object[] values, ...)
    {
        return values.Clone();
    }

    ...
}

次に、コマンド実行ロジックで

public void OnExecute(object parameter)
{
    var values = (object[])parameter;
    var width = (double)values[0];
    var height = (double)values[1];
}