5

私はEntity FrameworkモデルでMVVMパターンを使用してC#でデスクトップアプリケーションを作成しています。私はVMのDependencyPropertiesを使用する傾向があり、(一般的に)INotifyPropertyChangedの実装よりもこのシステムを好むようになりました。私は物事を一貫させておきたいと思います。私のVMはモデル内のエンティティにアクセスし、物事をかなり別々に保つことができました。ビューにはバインディングやコマンド名以外のVMの知識はなく、モデルはVMの知識を知っています。 VMでINotifyPropertyChangedのを使用してEntity FrameworkでViewModelでDependencyPropertyを使用する

は、モデルのエンティティを更新するために、とても簡単そうです:CurrentPersonは、Personオブジェクトエンティティデータモデルによって自動作成され

public string Forename 
    { 
     get { return CurrentPerson.Forename; } 
     set 
     { 
      if (Forename != value) 
      { 
       CurrentPerson.Forename = value; 
       NotifyPropertyChanged("Forename"); 
      } 
     } 
    } 

...。したがって、Forenameを格納するために特別に作成されたプライベートフィールドはありません。

DependencyPropertiesでは、DPを作成し、GetValueとSetvalueを使用してデフォルトプロパティを追加し、次にCurrentPerson Entityを更新するためにPropertyChangedCallbackを使用する必要があるようです。この状況でコールバックを呼び出すと、他のVMと一貫性を持たせるためにオーバーヘッドが追加されているようです。

これらの方法のいずれかが他の方法であるかどうかは問われます。になりますか?この例では、DependencyPropertyまたはINotifyPropertyChangedを使用する必要がありますか?注目すべき点の1つは、これは潜在的に非常に大規模なプロジェクト(プラグインと異なるマシンからの多数のデータベースアクセス)であり、すべてが本当に再利用可能であるべきであり、モジュールは可能な限り「切断」されていることです。

+0

ビューモデルに依存関係プロパティを使用する利点は何ですか?言い換えれば、INotifyPropertyChangedが提供する追加的な価値は何を提供していないのでしょうか。 –

+0

私は優れたスピードと、DPに付属している素晴らしいバインディング機能を探しています。自分のビューでXAMLを使用してDPに直接バインドしていることに注意してください。また、不動産価値の変化が頻繁に発生する可能性があります。私が以前に見つけた参考文献から、バインディングのスピードを上げるためには、DPが道のりです。残りのデザインとの一貫性もあります。しかし、Entityオブジェクトに対する個別の修正を行っているすべてのコールバックによって否定された場合、これはどれも良いことではありません。 –

答えて

2

DependencyPropertyの代わりにINotifyPropertyChangedを使用することをお勧めします。 DependencyPropertyがWindowsBase.dllにあるため、私がViewModelsのDependencyPropertyから離れている主な理由があります。これは、Windows UIに少しすぎます(少なくともIMHO)。

INotifyPropertyChangedを使用すると、さまざまなプラグインで必要な方法で実装できるため、管理が簡単になります。依存関係プロパティを強制すると、すべてのビューモデルがDependencyObjectから継承する必要があります。

INotifyPropertyChangedのとしたDependencyPropertyの使用の詳細についてはこちらの記事を参照してください:http://kentb.blogspot.com/2009/03/view-models-pocos-versus.html

別のサポートの答え:https://stackoverflow.com/a/783154/27669

+0

ありがとうございます。私は、INotifyPropertyChangedが "Magic Strings"を使用することに対する様々な保護手段を備えたイベントでも、INotifyPropertyChangedが行く方法だと思っています。私がこの観点に着手する2つの主な理由は、1)DPとの状態複製、2)オブジェクト状態全体を変更する必要があることがあり、単にPropertyChanged(null)でこれを行うことができます。答えと参考に感謝します。 –

+0

Windows UIへのカップリングは大きな問題になる可能性があります。同じDLLがWebサービスに使用されていたが、Dependency PropertyがマルチスレッドWebサービスでややこしいUIスレッドで動作すると主張していたプロジェクトを修正しました。このアーキテクチャの柔軟性(つまり、Entity DllのWindows GUIとの緊密な結合の欠如)は、GUIの優雅さよりもはるかに重要です。 – user1496062

関連する問題