我已经看到了两种定义命令的方法
public DelegateCommand OpenCommand {get;set;}
public ViewModelConstructor()
{
OpenCommand = new DelegateCommand(OpenMethod);
}
其他人决定直接设置它,因为命令更改并不常见。
public DelegateCommand => new DelegateCommand(OpenMethod);
这似乎是一种更干净的方法,但是也许希望在构造函数中对其进行定义,这样其他人就很清楚了。
在哪里定义对象(例如在运行时不会更改的命令)的约定是什么?
答案 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
时,它为空。