小编典典

使用 WPF 绑定传递两个命令参数

all

我有一个使用以下标准语法从我的 XAML 文件执行的命令:

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

这工作得很好,直到我意识到我需要来自视图的两条信息才能使这个操作按照用户期望的方式完成(具体来说是画布的宽度和高度)。

似乎可以将数组作为参数传递给我的命令,但我看不到有一种方法可以在 CommandParameter 中指定绑定到我的两个画布属性:

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

如何将宽度和高度都传递给我的命令?使用 XAML
中的命令似乎不可能做到这一点,我需要在我的代码隐藏中连接一个单击处理程序,以获取此信息以传递给我的缩放方法。


阅读 102

收藏
2022-08-29

共1个答案

小编典典

首先,如果您正在执行 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];
}
2022-08-29