使用WPF绑定传递两个命令参数
我有一个命令,我使用以下标准语法从我的XAML文件执行:
<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand}"/>
这工作得很好,直到我意识到我需要从视图中的两条信息,以使这个操作完成用户期望的方式(特定的canvas的宽度和高度)。
它似乎有可能将一个数组作为parameter passing给我的命令,但我没有看到有一种方法来指定绑定到我在CommandParameter中的两个canvas属性:
<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand" CommandParameter={Binding ElementName=MyCanvas, Path=Width}"/>
我如何通过宽度和高度我的命令? 这似乎不可能使用来自XAML的命令,我需要在代码隐藏中连接一个点击处理程序来获取这个信息传递给我的缩放方法。
首先,如果你在做MVVM,你通常会通过从视图中绑定的属性来获得这些信息。 这样可以节省您不必将任何parameter passing给您的命令。
但是,您也可以多重绑定并使用转换器来创build参数:
<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]; }
在所选解决scheme的转换器中,应该添加values.Clone(),否则命令中的参数将为null
public class YourConverter : IMultiValueConverter { public object Convert(object[] values, ...) { return values.Clone(); } ... }
在Converter中使用Tuple,在OnExecute中将参数对象转换回Tuple。
public class YourConverter : IMultiValueConverter { public object Convert(object[] values, ...) { Tuple<string, string> tuple = new Tuple<string, string>( (string)values[0], (string)values[1]); return (object)tuple; } } // ... public void OnExecute(object parameter) { var param = (Tuple<string, string>) parameter; }