2016-10-04 11 views
0

私は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関数です。
私はそれをより簡潔にしたいと思っていますが、どこから始めたらよいかはわかりません。

上記のプロパティを再生するビューでは、ゲッターとセッターはどのように見えるのですか?

+0

@HenkHoltermanと完全に同意すると、INPC実装を基本クラスに移すことができます。ここに私が使用した小さな例がありますhttp://stackoverflow.com/questions/33801100/where-i-need-to-define-inotifypropertychanged-in-case-of-base-and-sub-classes/33805183# 33805183 – Ilan

+0

まず、derp( 'PropertyChanged?.Invoke(...)')を減らす言語機能を忘れないでください。第二に、このような状況を改善する方法はたくさんあります。 IDynamicMetaObjectProvidersなどでPOCOを折り返します。 – Will

答えて

3

INPCの実装は常にWPF/XAMLの醜い部分のままです。良い基底クラスでは、それは{ get { return _loadFilename; } set { Set(ref _loadFilename, value); } }に縮小することができますが、それは得るほどコンパクトです。 Resharperはこれにリファクタリングをサポートしています。

Btw、あなたのコードにも最適化ガードがありませんif(value != _loadFilename)だからBindableBase基本クラスは間違いなく良い考えです。

2

Fody's PropertyChangedのようなものを調べると、ビルド時にILを書き換えて変更通知コードを注入することができます。

-1
private type m_name; 
    public type name 
    { 
     get { return m_name; } 
     set 
     { 
      m_name = value; 
      if (PropertyChanged != null) 
      { PropertyChanged(this, new PropertyChangedEventArgs("name")); } 
     } 
    } 

リスナーを必要とするプロパティの変更には、上記のコードを使用します。 typeはプロパティの名前、nameはプロパティの名前です(コードのどこにでも 'type'と 'name'を変更してください)

プロパティの変更とコードスニペットの詳細を説明したMVVMの素晴らしいチュートリアルは、 youtubeでJerry Nixonをチェックしてください:https://www.youtube.com/watch?v=cB7KdYPQw1k 少し古いですが、それでも非常に役立ちます!

+0

引用符で「名前」を使用すると、元のコードの後ろに大きなステップがあります。そして、これも長くなります。 OnPropertyChange()メソッドは推奨パターンに属します。 –

+0

おかげで... – Ag71191

関連する問題