寻找将按钮命令绑定到ViewModel ICommand属性的最优雅解决方案,同时允许在View中进行确认.
我想做什么:
可以通过显示ViewModel中的消息框来满足确认要求.但是,我不认为这是要走的路.它不打破MVVM吗?如果CanExecute取决于UI(代码隐藏)和ViewModel的状态怎么办?此外,从ViewModel弹出消息框时的可测试性如何?
我尝试的另一件事是绑定OnClick(到View)和Command(到ViewModel).虽然事件始终在Command之前执行,但似乎无法取消执行该命令.此外,执行顺序似乎是一个未记录的功能,所以你不应该依赖它.除此之外,它仍然不允许CanExecute考虑View逻辑.
接下来我想出了以下解决方案:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<Button Content="Do Work" Command="{Binding Path=ViewModel.SaveCommand}"/>
</Grid>
<SelectTemplateUserControl Visibility="Collapsed" OnTemplateSelected="SelectTemplate_OnTemplateSelected"/>
</Window>
Run Code Online (Sandbox Code Playgroud)
public partial class MainWindow : Window
{
private readonly MainViewModel _viewModel = new MainViewModel();
public MainWindow()
{
InitializeComponent();
}
public MainViewModel ViewModel { get { return this._viewModel; } }
public ICommand SaveCommand { get { return new RelayCommand<int>(this.Save, this.CanSave);} }
private bool CanSave(int templateId)
{
return this._viewModel.SaveCommand.CanExecute(null);
}
private void …Run Code Online (Sandbox Code Playgroud)