[英]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.