假设您有一个
MainWindow
,并在其中放置了按钮。
创建一个MainWindowViewModel
并将其设置为MainWindow的DataContext
。
在您的ViewModel上有一个ICommand
,并将按钮命令与此ICommand
绑定,以便打开另一个窗口的入口点是单一的。对于ICommand,您可以使用RelayCommand
或DelegateCommand
中最适合您的那个。
现在,根据按钮类型单击需要打开窗口并传递参数的点。我建议使用枚举表示基于不同按钮执行的操作。
枚举
public enum ActionType
{
Action1,
Action2,
Action3 and so on...
}
并且可以通过以下方法将按钮进行绑定:
<Button Command="{Binding CommandInstance}"
CommandParameter="{x:Type local:ActionType.Action1}"/>
<Button Command="{Binding CommandInstance}"
CommandParameter="{x:Type local:ActionType.Action2}"/>
local将是声明枚举的命名空间。
在命令执行委托中,将枚举值传递给另一个窗口的构造函数:
private void CommandMethod(ActionType action)
{
AnotherWindow anotherWindow = new AnotherWindow(action);
anotherWindow.Show();
}
通过构造函数传递的操作,您可以检查需要传递给负责加载数据的服务的参数。
此外,如果从ViewModel创建窗口不合适,则可以拥有覆盖窗口控件的服务包装器,该服务负责显示/关闭窗口。
更新
由于您想要从视图传递多个参数,因此维护枚举将很麻烦。您可以使用IMultiValueConverter从视图传递多个值。
让我用一个简单的例子来解释:
<Button Command="{Binding TestCommand}">
<Button.Resources>
<sys:String x:Key="Rush">Rush</sys:String>
<sys:String x:Key="Warehouse">Warehouse</sys:String>
</Button.Resources>
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource MultiValuesReturnConverter}">
<Binding Source="{StaticResource Rush}"/>
<Binding Source="{StaticResource Warehouse}"/>
</MultiBinding>
</Button.CommandParameter>
</Button>
在XAML中,sys
将成为System的命名空间:
xmlns:sys="clr-namespace:System;assembly=mscorlib"
所以,现在你可以在XAML中自由地传递许多对象到你的命令参数。你所要做的就是在按钮资源部分声明资源,并将其作为绑定传递给转换器。
转换器代码将其转换为可以作为单个参数对象传递给命令的参数列表:
public class MultiValuesReturnConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType,
object parameter, CultureInfo culture)
{
return values.ToList<object>();
}
public object[] ConvertBack(object value, Type[] targetTypes,
object parameter, CultureInfo culture)
{
throw new System.NotImplementedException();
}
}
Command Method:
private void CommandMethod(object parameter)
{
// Now you have all the parameters here to take decision.
IList<object> values = parameter as List<object>;
AnotherWindow anotherWindow = new AnotherWindow(action);
anotherWindow.Show();
}