![](/img/trans.png)
[英]Is it safe to call new RelayCommand (ICommand) in Expression-Bodied Properties
[英]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);
自动属性不会编译,因为OnExecute
和CanExecute
方法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.