簡體   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