2017-05-18 10 views
0

Valueというプロパティが付いたモデルがあるとします。モデルはINotifyPropertyChangedを実装しています。次に、モデルを知っているビューモデルを仮定し、それ自身に架空のビューにプロパティValueを提供します。モデルのプロパティをラップするビューモデルを実装する方法

ビューモデルのコードスニペット

public int Value 
{ 
    get { 
     Model.Value; 
    } 
    set { 
     if(value != Model.Value) { 
      Model.Value = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

すなわちを次のようにこのビューモデルが実装されていますこの時点でのビュー全体の目的は、モデルのプロパティをビューに直接渡すことです。

ビューモデルは、モデルのPropertyChangedイベントに登録されています。モデルのValueが変更されるたびに、ビューモデルは変更を認識してPropertyChangedイベント自体をトリガーし、ビューモデルのプロパティーValueにバインドするビューは自身を更新することがわかります。

1は、ビューモデルを経由してモデルを変更した場合。これは、複数のPropertyChangedのコールをリード:

中に入ると再び Model.Value = value;
  • を実行した後、モデルの変更を待機するビューモデルのコードで
    1. 私の心に来るValueによる

    OnPropertyChanged();の唯一の解決策のセッターがcompletlyモデルからビューモデルを分離することです。これには、モデルのデータの完全なクローンを保持することも含まれます。このように私はPropertyChangedの最初の呼び出しを避けることができます。ビューモデルの値とモデルの値を比較することができるため、さまざまなソースを区別できます(ビューモデルの変更されたモデルまたはモデルが別のソースによって変更された)。

    ビューモデルははるかに複雑です。モデルをビューモデルにマージすることは解決策ではありません。

  • +0

    私はあなたのタイトルを完了したとは思わない... –

    +0

    申し訳ありません、私はそれを修正しました。 – liondog

    +0

    私はモデルを更新するためにviewmodelが必要であり、モデルは 'INotifyPropertyChanged'を実装すべきではないと思います。ビューモデル以外に誰がモデルを変更していますか?他のモデル?他のビューモデル? –

    答えて

    1

    モデルのプロパティーが変更されたビューモデルが既に登録されていて、独自のプロパティー変更が発生した場合、ビューモデルのプロパティーにはOnPropertyChanged()は必要ありません。

    削除OnPropertyChanged()

    のViewModelコードは次のようになります。

    public int Value { 
        get { 
         return Model.Value; 
        } 
        set { 
         if(value != Model.Value) { 
          Model.Value = value; 
         } 
        } 
    } 
    
    +1

    私はすでにこれについて考えていましたが、これは間接的なメカニズムであるため正しくないようです。 – liondog

    +0

    私は同意しません。目標は、ビューに通知することでした。モデルのプロパティ変更イベントを購読することでそれを行いました。ビューモデルで手動で行う必要がありません。上に複雑なことをする必要はありません – Nkosi

    +1

    あなたは正しいと思います。私は記事がhttp://geekswithblogs.net/DavidVallens/archive/2011/04/01/writing-mvvm-viewmodel-wrappers---part-1.aspxを見つけましたが、それはやや同じ方向に向いています。 – liondog

    1

    viewmodelは、ビューの更新とモデルの更新を担当する必要があります。

    モデルがINotifyPropertyChangedを実装すべきでない理由を本質的に特定したので、それが必要なものは何もしないでください。あなたがやろうとしていることを行うためのきれいな、通常のMVVMの方法はありません。これはMVVMを間違っていることを示唆しています。もちろん、MVVMは聖なるものではありませんが、うまくいきます。代わりにあなたがしていることは、すでにあなたを困らせてしまっています。作成する必要のない問題が作成されましたが、それに対する良い解決策はありません。答えは、最悪の解決策を選択することではありません。それは戻ってデザインから問題を取り除くことです。

    このデザインは根本的に不愉快なものであり、さらに複雑さを加えることによってそれを救済しようとすると、混乱することになります。あなたがそれから学んだのでそれは価値がありましたが、それ以上の時間を投資する価値はありません。

    「モデルのプロパティをラップのviewmodelを実装する方法[プロパティ]」あなたのリテラル質問への答えは、次のとおりです。

    あなたpublic int Value例では、しかしINotifyPropertyChangedを実装するモデルずにそれをやっただけのような。

    +0

    'INotifyPropertyChanged'を実装していない同じモデルで動作する複数のビューモデルがある場合、どのように変更について知っていますか?ビューモデルがお互いに通知しなければならないことを示唆していますか? – liondog

    +0

    @lcmそれは私にとって良い考えのようには聞こえません。私たちはそれを避けることができなかった仕事で働いているアプリケーションに1つの場所を持ち、ユーザーはリフレッシュする必要があることを理解しています。問題ではありませんでした。 –

    関連する問題