相关疑难解决方法(0)

使用View中的确认逻辑命令绑定到ViewModel

寻找将按钮命令绑定到ViewModel ICommand属性的最优雅解决方案,同时允许在View中进行确认.

我想做什么:

  1. 只允许用户在他/她应该时单击按钮
  2. 单击该按钮时,请确认
  3. 如果确认,请在ViewModel中工作,否则取消
  4. 不要打破MVVM架构

可以通过显示ViewModel中的消息框来满足确认要求.但是,我不认为这是要走的路.它不打破MVVM吗?如果CanExecute取决于UI(代码隐藏)和ViewModel的状态怎么办?此外,从ViewModel弹出消息框时的可测试性如何?

我尝试的另一件事是绑定OnClick(到View)和C​​ommand(到ViewModel).虽然事件始终在Command之前执行,但似乎无法取消执行该命令.此外,执行顺序似乎是一个未记录的功能,所以你不应该依赖它.除此之外,它仍然不允许CanExecute考虑View逻辑.

接下来我想出了以下解决方案:

查看(XAML)

<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)

c# wpf mvvm icommand mvvm-light

3
推荐指数
1
解决办法
2018
查看次数

标签 统计

c# ×1

icommand ×1

mvvm ×1

mvvm-light ×1

wpf ×1