私はMVVMアーキテクチャでいくつかのコードをリファクタリングしようとしています。
モデルには、パブリック値が直接変更されています。モデルからMVVMのビューへのプロパティ変更を定義する理想的な方法は何ですか?
これらの値の変更をUIがリッスンします。
以下コードを知らせるイベントです:
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
これは、MVVMで自然である必要があり、何かのために定型の多くのように思える:
public string LoadFilename { get { return _loadFilename; } set { _loadFilename = value; OnPropertyChanged(); } }
public string SaveFilename { get { return _saveFilename; } set { _saveFilename = value; OnPropertyChanged(); } }
public string OneSafFilename { get { return _oneSafFilename; } set { _oneSafFilename = value; OnPropertyChanged(); } }
public bool IsSaveEnabled { get { return _isSaveEnabled; } set { _isSaveEnabled = value; OnPropertyChanged(); } }
public bool IsLoadEnabled { get { return _isLoadEnabled; } set { _isLoadEnabled = value; OnPropertyChanged(); } }
public bool IsLoadCheckpointEnabled { get { return _isLoadCheckpointEnabled; } set { _isLoadCheckpointEnabled = value; OnPropertyChanged(); } }
public bool IsCheckpointEnabled { get { return _isCheckpointEnabled; } set { _isCheckpointEnabled = value; OnPropertyChanged(); } }
public bool IsScenariosEnabled { get { return _isScenariosEnabled; } set { _isScenariosEnabled = value; OnPropertyChanged(); } }
ここOnPropertyChanged
関数です。
私はそれをより簡潔にしたいと思っていますが、どこから始めたらよいかはわかりません。
上記のプロパティを再生するビューでは、ゲッターとセッターはどのように見えるのですか?
@HenkHoltermanと完全に同意すると、INPC実装を基本クラスに移すことができます。ここに私が使用した小さな例がありますhttp://stackoverflow.com/questions/33801100/where-i-need-to-define-inotifypropertychanged-in-case-of-base-and-sub-classes/33805183# 33805183 – Ilan
まず、derp( 'PropertyChanged?.Invoke(...)')を減らす言語機能を忘れないでください。第二に、このような状況を改善する方法はたくさんあります。 IDynamicMetaObjectProvidersなどでPOCOを折り返します。 – Will