这个任务也可以用不同的方法解决。而不是编写一个转换器并在XAML中扩展代码,您还可以在ViewModel中聚合各种参数。结果,ViewModel将具有包含所有参数的另一个属性。
以下是我当前应用程序的示例,它也让我处理了这个主题。
需要一个通用的RelayCommand:https://dev59.com/dGEh5IYBdhLWcg3wjEDn#22286816
在此处通过命令SaveAndClose扩展了ViewModelBase。泛型类型是表示各种参数的命名元组。
public ICommand SaveAndCloseCommand => saveAndCloseCommand ??= new RelayCommand<(IBaseModel Item, Window Window)>
(execute =>
{
execute.Item.Save();
execute.Window?.Close(); // if NULL it isn't closed.
},
canExecute =>
{
return canExecute.Item?.IsItemValide ?? false;
});
private ICommand saveAndCloseCommand;
然后它包含一个根据泛型类型的属性:
public (IBaseModel Item, Window Window) SaveAndCloseParameter
{
get => saveAndCloseParameter ;
set
{
SetProperty(ref saveAndCloseParameter, value);
}
}
private (IBaseModel Item, Window Window) saveAndCloseParameter;
视图的XAML代码如下所示:
(注意经典的点击事件)
<Button
Command="{Binding SaveAndCloseCommand}"
CommandParameter="{Binding SaveAndCloseParameter}"
Click="ButtonApply_Click"
Content="Apply"
Height="25" Width="100" />
<Button
Command="{Binding SaveAndCloseCommand}"
CommandParameter="{Binding SaveAndCloseParameter}"
Click="ButtonSave_Click"
Content="Save"
Height="25" Width="100" />
并在视图的代码后台中,然后评估点击事件,之后设置参数属性。
private void ButtonApply_Click(object sender, RoutedEventArgs e)
{
computerViewModel.SaveAndCloseParameter = (computerViewModel.Computer, null);
}
private void ButtonSave_Click(object sender, RoutedEventArgs e)
{
computerViewModel.SaveAndCloseParameter = (computerViewModel.Computer, this);
}
就我个人而言,我认为使用点击事件并不违反MVVM模式。程序流程控制仍然位于ViewModel的范畴。