c# - 在哪里设置命令?
问题描述
我见过两种不同的方式来定义命令
public DelegateCommand OpenCommand {get;set;}
public ViewModelConstructor()
{
OpenCommand = new DelegateCommand(OpenMethod);
}
而其他人决定直接设置它,因为命令更改是不常见的。
public DelegateCommand => new DelegateCommand(OpenMethod);
这似乎是一种更清洁的方法,但也许应该在构造函数中定义它们,以便其他人清楚。
关于在何处定义对象(例如在运行时不会更改的命令)的约定是什么?
解决方案
正如@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,当我触发时Button
forXCommand
不会显示为禁用SwitchCommand
。
这似乎与RaiseCanExecuteChanged()
调用时的事实有关null
。
推荐阅读
- amazon-eks - 无法在 EKS 集群上创建 PodPreset
- javascript - elementsFromPoint 不包含 mouseover 元素
- ssl - AWS 应用程序负载均衡器上的 Websocket + SSL
- php - PHP:为什么只能通过引用传递变量?
- javafx - 如何在超链接单击时获取 tableview 项目
- postgresql - Postgres LIKE %% 语法错误
- spring - 我如何知道 SSL 证书链正在被验证?
- r - 使用 R 包中的 `/exec` 目录用于 R 脚本以进行可重复的研究
- webpack - 为什么 webpack 的事件监听器钩子叫做 `plugin` 而不是 `on` 之类的?
- gmail - 是否可以链接到 GMail 委托帐户中的电子邮件