在哪里设置命令?

时间:2019-06-20 09:21:15

标签: c# wpf mvvm command

我已经看到了两种定义命令的方法

public DelegateCommand OpenCommand {get;set;}

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

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

public DelegateCommand => new DelegateCommand(OpenMethod);

这似乎是一种更干净的方法,但是也许希望在构造函数中对其进行定义,这样其他人就很清楚了。

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

1 个答案:

答案 0 :(得分:1)

如@ 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的视图时,Button的{​​{1}}在触发XCommand时不会显示为已禁用。 / p>

这似乎与以下事实有关:在调用SwitchCommand时,它为空。