我正在将我的项目转移到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
方法需要是静态的,我需要在这些方法中访问我的viewmodel中的私有成员。
表达式实体工作正常,但是对于MyCommand
属性的每次调用\ databind,都会创建一个新的RelayCommand。这对我来说也不合适。
任何人都有任何想法如何将C#6与RelayCommands合并?
答案 0 :(得分:2)
我认为这是您在C#6功能中可以实现的最佳功能:
ActionBar ab = getActionBar();
ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
View actionBarView = getLayoutInflater().inflate(R.layout.custom_action_bar, null);
ab.setCustomView(actionBarView);
与原始C#5代码的唯一区别在于,您现在能够删除属性私有设置器,这使得它只是简单的读取。一旦构造了对象,您将无法从任何地方的代码隐藏中更改它的值。在设计不可变对象时非常有用。
修改强> 在更多的方法,这是有效的,但其可读性是有争议的。优点是您无需导航到ctor以查找命令实例化。
public MyViewModel()
{
MyCommand = new RelayCommand(OnExecute, CanExecute);
}
public ICommand MyCommand { get; }
答案 1 :(得分:1)
表达身体属性的例子看起来没问题。
public ICommand MyCommand => new RelayCommand(OnExecute, CanExecute);
旧式是
public ICommand MyCommand
{
get { return new RelayCommand(OnExecute, CanExecute); }
}
AFAIK Expression-bodied属性只是语法糖。 =>使用大括号和关键字得到{return}
每次调用databind都会创建一个新的RelayCommand是标准方法。