1

コードを最初に実装し、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 回だけ発生させる方法は?

4

0 に答える 0