c# - MVVM C#​​6 RelayCommand 自动或表达式主体属性

标签 c# wpf mvvm mvvm-light c#-6.0

我正在将我的项目迁移到 C#6 和 Visual Studio 2015,并且正在考虑改进我的代码以适应 Roselyn 的最新功能。

当前代码:

public MyViewModel()
{
    MyCommand = new RelayCommand(OnExecute, CanExecute);
}

public ICommand MyCommand { get; private set; }

自动属性

public ICommand MyCommand { get; } = new RelayCommand(OnExecute, CanExecute);

表达式主体属性

public ICommand MyCommand => new RelayCommand(OnExecute, CanExecute);

自动属性无法编译,因为 OnExecuteCanExecute 方法需要是静态的,并且我需要在这些 View 模型中访问私有(private)成员方法。

表达式主体实现有效,但对于每次调用\databind 到 MyCommand 属性,都会创建一个新的 RelayCommand。这对我来说似乎也是不对的。

有人知道如何将 C#6 与 RelayCommands 结合起来吗?

最佳答案

我认为这是您可以使用 C# 6 功能实现的最佳功能:

public MyViewModel()
{
    MyCommand = new RelayCommand(OnExecute, CanExecute);
}

public ICommand MyCommand { get; }

与原始 C# 5 代码的唯一区别是,您现在可以删除属性私有(private) setter,这使得它真正成为只读的。一旦构造了对象,您将无法在任何地方的代码隐藏中更改它的值。这在设计不可变对象(immutable对象)时非常有帮助。

编辑: 在更多方法上,这是可行的,但其可读性存在争议。优点是您不必导航到 ctor 来查找命令实例化。

private ICommand _myCommand;
public ICommand MyCommand => _myCommand ?? (_myCommand = new RelayCommand(Execute));

关于c# - MVVM C#​​6 RelayCommand 自动或表达式主体属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31803508/

相关文章:

c# - C#程序的自动更新

c# - 具有 2 个操作的单行 if 语句

c# - ScintillaNet - 无法将其添加到工具箱

c# - C#中用于文件名验证的正则表达式

c# - 禁用按钮时单击按钮时的工具提示

c# - 有没有办法测量 WPF flowdoc 中 block /部分的高度?

c# - 在WPF中如何防止ScrollViewer内的控件展开

c# - 如何消除错误 "XamlParseException: Set connectionId threw an exception"?

c# - ViewModel 如何防止恶意数据库更改?

c# - 添加控件以从ViewModel查看