0

MVVM アーキテクチャで一部のコードをリファクタリングしようとしています。
モデルには、直接変更される公開値があります。

UI は、これらの値の変更をリッスンします。

以下は、イベント シグナリング コードです。

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関数 は次のとおりです。

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

これは、MVVM で自然であるべきことの多くのボイラープレートのように思えます。
もっと簡潔にしたいのですが、どこから始めればいいのかわかりません。

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

4

3 に答える 3

3

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

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

于 2016-10-04T20:54:39.920 に答える
2

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

于 2016-10-04T20:59:24.193 に答える
-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

于 2016-10-04T21:12:50.970 に答える