繁体   English   中英

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

[英]MVVM C#6 RelayCommand auto or expression-bodied properties

我正在将项目移至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方法CanExecute必须是静态的,而我需要使用这些方法访问我的视图模型中的私有成员。

表达式强健的实现有效,但是对于对MyCommand属性的每个调用\\ databind,都会创建一个新的RelayCommand。 在我看来,这也不对。

任何人都有任何想法如何将C#6与RelayCommands结合在一起?

我认为这是使用C#6功能可以达到的最佳效果:

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

public ICommand MyCommand { get; }

与原始C#5代码的唯一区别是,您现在可以删除属性私有设置程序,这使它真正变为只读。 构造对象后,您将无法从任何地方的代码背后更改其值。 在设计不可变对象时,这非常有用。

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

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

您的表达式主体属性示例看起来不错。

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

旧样式是

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

AFAIK表现力强的属性只是语法糖。 =>代替大括号,关键字get {return}

每次对databind的调用都会创建一个新的RelayCommand是标准方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM