コードを最初に実装し、MVC パターンを実装し、Entity Framework 4.1 を使用しています。問題を太字にしました。
次の POCO オブジェクト (Department) があり、contextDB.SaveChanges() が実行されて更新されるといつ変更されるかを知りたいので、(簡単にするために) 以下を実装すると仮定します。
public class Department : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(object sender, PropertyChangedEventArgs e)
{
PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
if (propertyChanged != null)
{
propertyChanged(this, e);
}
}
[Key(), Required]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
private string name;
[Required]
public string Name
{
get
{
return this.name;
}
set
{
if (this.name== value)
{
return;
}
this.name= value;
this.NotifyPropertyChanged(this, new PropertyChangedEventArgs("Name"));
}
}
private string personInCharge;
[Required]
public string PersonInCharge
{
get
{
return this.personInCharge;
}
set
{
if (this.personInCharge== value)
{
return;
}
this.personInCharge= value;
this.NotifyPropertyChanged(this,
new PropertyChangedEventArgs("PersonInCharge"));
}
}
}
M (モデル)、V (ビュー)、C (コントローラー) 用の 3 つのプロジェクト (クラス ライブラリ) があります。
ビュー(V)から、ユーザがボタンを押して部門を追加するなどのイベントを生成し、コントローラ(C)を参照するビューがコントローラ内のメソッド「追加」を呼び出します。
モデル (M) を参照するコントローラー (C) は、モデル内の dbContext から派生するクラスをインスタンス化するため、コンテキストにアクセスできます。コンテキストを介して、たとえば dbContext.departments.add を実行してエンティティ「Department」を更新します。 (新しい部門)。
モデルでエンティティ部門が更新されると、エンティティ部門で上記の NotifyPropertyChanged が発生しますが、私の問題はここから始まります。エンティティ部門が変更されたため、ビュー部門を更新する必要があります。
それを達成するために、私はオブザーバーパターンを実装しました。つまり、「更新」と呼ばれるメソッドを持つビュー部門が、モデルによって維持されるオブザーバーのコレクションに関連付けられているため、モデルはプロパティの変更時に、このコレクションを反復処理して呼び出しますビューごとに「Update」メソッドを実行すると、ビューが更新されます。
ここでの私の問題は次のとおりです。ビューから上記のクラス department のイベント PropertyChanged にサブスクライブする方法がわからないため、Department POCO オブジェクト (クラスは上記で説明) でプロパティが変更されると、モデルは含まれるオブザーバー コレクションを反復処理します。オブザーバーがアタッチされ、コレクションにアタッチされた各ビュー (オブザーバー) に対して適切な「更新」メソッドが呼び出されます。または、POCO オブジェクトに INotifyPropertyChanged を使用するよりも、別のより良い方法がありますか?
また、INotifyPropertyChanged を使用する際の問題も見られます。たとえば、depatment が追加されるたびに、NotifyPropertyChanged が 2 回発生するため、ビューが 2 回更新されます。1 つは Name プロパティから、もう 1 つは PersonInCharge プロパティからです。ここで別の問題: NotifyPropertyChanged イベントを 2 回ではなく 1 回だけ発生させる方法は?