我正在将我的项目迁移到 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);
自动属性无法编译,因为 OnExecute
和 CanExecute
方法需要是静态的,并且我需要在这些 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/