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

时间:2015-08-04 07:46:47

标签: 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方法需要是静态的,我需要在这些方法中访问我的viewmodel中的私有成员。

表达式实体工作正常,但是对于MyCommand属性的每次调用\ databind,都会创建一个新的RelayCommand。这对我来说也不合适。

任何人都有任何想法如何将C#6与RelayCommands合并?

2 个答案:

答案 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是标准方法。