首页 > 解决方案 > 在哪里设置命令?

问题描述

我见过两种不同的方式来定义命令

public DelegateCommand OpenCommand {get;set;}

public ViewModelConstructor()
{
   OpenCommand = new DelegateCommand(OpenMethod);
}

而其他人决定直接设置它,因为命令更改是不常见的。

public DelegateCommand => new DelegateCommand(OpenMethod);

这似乎是一种更清洁的方法,但也许应该在构造函数中定义它们,以便其他人清楚。

关于在何处定义对象(例如在运行时不会更改的命令)的约定是什么?

标签: c#wpfmvvmcommand

解决方案


正如@vasily.sib 提到的,第二种方法将在每次调用时创建一个新实例。

我发现第二种方法实际上会因此导致RaiseCanExecuteChanged影响视图的方式出现问题。考虑以下 ViewModel:

public class ViewModel
{
    private bool CanEx { get; set; }

    public DelegateCommand XCommand => new DelegateCommand(X, Can);
    public DelegateCommand YCommand { get; set; }
    public DelegateCommand SwitchCommand { get; set; }

    public ViewModel()
    {
        CanEx = true;
        YCommand = new DelegateCommand(Y, Can);
        SwitchCommand = new DelegateCommand(Switch);
    }

    private void X(object obj) => System.Diagnostics.Debug.WriteLine("X");

    private void Y(object obj) => System.Diagnostics.Debug.WriteLine("Y");

    private bool Can(object obj) => CanEx;

    private void Switch(object obj)
    {
        CanEx = !CanEx;

        XCommand.RaiseCanExecuteChanged();
        YCommand.RaiseCanExecuteChanged();
    }
}

当我从这个 ViewModel 创建一个视图时,Button每个命令都有 s,当我触发时ButtonforXCommand不会显示为禁用SwitchCommand

这似乎与RaiseCanExecuteChanged()调用时的事实有关null


推荐阅读