私はSQL DBを持っており、WPF UIを実装してそれを更新しています。 DBからクラスを生成するためにEF5を使用する場合、生成されたクラスとプロパティにINotifyPropertyChangedを実装してUIに簡単にバインドできますか?これを達成する簡単な方法はありますか?生成されたEntity FrameworkクラスにINotifyPropertyChangedを実装します
おかげ
私はSQL DBを持っており、WPF UIを実装してそれを更新しています。 DBからクラスを生成するためにEF5を使用する場合、生成されたクラスとプロパティにINotifyPropertyChangedを実装してUIに簡単にバインドできますか?これを達成する簡単な方法はありますか?生成されたEntity FrameworkクラスにINotifyPropertyChangedを実装します
おかげ
あなたはWPFのための推奨MVVMパターンに従っている場合、あなたはモデルとしてあなたの生成されたクラスを扱い、その後、INotifyPropertyChangedの実装をViewModelにラッパーを書くことができます。 ViewModelクラスはDBクラスにアクセスし、XAMLのUIにバインドできるプロパティを公開します。
あなたのコメントに記載されているように、これは定型コードを書く多くの作業につながりますが、それに対処する方法はいくつかあります。いくつかのアイデアについては、this questionを参照してください。
中間フォーマットや処理を行う必要がある場合や、UIに影響を与えずにデータベースクラスを変更する必要がある場合、MVVMパターンは長期的にはっきりしています。
私はWinformsを使用して同じことを最近行う必要がありました。 bdeが提案するMVVMパターンに従わない場合は、t4テンプレートを変更して、生成されたエンティティにINotifyPropertyChangedを実装できます。
あなたは(:)少し危険な)あなたの特性上のPropertyChangedものを生成するために、EFテンプレート(.ttファイル)を編集したり、することができます生成されたクラスを編集します。最後は少し危険です。モデルを再生成すると、すべての変更が失われるためです。ラッパークラスやテンプレート編集(ビットハード:S)のバリアントが最高です。
クラスプロパティにINotifyPropertyChangedを追加することを本当に簡単にするPropertyChanged.FodyというNuGetパッケージがあります。パッケージをインストールしたら、クラスまたは部分クラスに[ImplementPropertyChanged]属性を追加するだけで、パッケージはINotifyPropertyChangedを追加します。
ここでは簡単な使用例を示します。
using PropertyChanged;
[ImplementPropertyChanged]
public partial class Order
{
}
詳細については、GitHubを参照してください。
EFで生成されたすべてのクラスをINotifyPropertyChanged
インターフェイスを実装するクラスから継承するようにします(既に定義済みの生成されていない部分クラスを使用します)。この基本クラスにメソッドを追加します。これにより、という空の文字列を持つPropertyChanged
イベントが発生します。次に、EFで生成されたクラスインスタンスでこのメソッドを呼び出すたびに、そのすべての変更されたプロパティがWPF UIでリフレッシュされます。
たとえば、 'class Asset {public int id {get; set;}}を生成した場合、'クラスAssetWrap:Asset、INotifyPropertyChanged {public int idNotify {get {return id; } set {id = value; NotifyPropertyChanged();}}} 'もしそうなら、それは非常に時間がかかるようです。 – Steve
通常、ViewModelはModelから継承されませんが、代わりにModelオブジェクトのフィールドがあります。したがって、 'class AssetWrap:INotifyPropertyChanged {private Asset _asset; public int idNotify {get {return _asset.id; }セット{_asset.id =値; NotifyPropertyChanged();}} '(これは完全ではありません)。そして、時には、MVVMパターンの面倒な定型文で終わることもありますが、いくつかの中間処理やモデルの表示方法を変更する必要がある場合には効果があります。このワークロードを減らすためのアイデアがある別の質問へのリンクを貼っています。 – WildCrustacean
私はMVVMのメリットを見ることができますが、MVVMジェネレータの中には、実際には同じものを頻繁に使用するMVVMジェネレータがたくさん必要です。 – Steve