1

以下に示すように定義されたクラスがあるとしましょう。ここで、このクラスをさらに変更してNotifyPropertyChangedを正しく実装し、WPFグリッドにバインドするコレクションに追加するとします。これらのインスタンスの1つのNameまたはDescriptionプロパティを変更するコードが実行された場合、他のインスタンスも更新されますか?WPF / XAMLバインディングは、これらを同じオブジェクトと見なしますか、それともインスタンスを異なるものとして扱い、変更されたオブジェクトのプロパティのみを更新しますか?

class Security
{       
    public string Ticker { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public override bool Equals(object obj)
    {
        if (obj == null) return false;

        if (this.GetType() != obj.GetType()) return false;

        Security security = (Security)obj;

        //reference check
        //if (!Object.Equals(Ticker, security.Ticker)) return false;

        //value member check
        if (!Ticker.Equals(security.Ticker)) return false;

        return true;
    }

    public static bool operator ==(Security sec1, Security sec2)
    {
        if (System.Object.ReferenceEquals(sec1, sec2)) return true;

        if (((object)sec1 == null) || ((object)sec2 == null)) return false;

        // Return true if the fields match:
        return sec1.Ticker == sec2.Ticker;
    }

    public static bool operator !=(Security sec1, Security sec2)
    {
        return !(sec1 == sec2);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            int hash = 17;
            // Suitable nullity checks etc, of course :)
            hash = hash * 23 + Ticker.GetHashCode();
            hash = hash * 23 + Ticker.GetHashCode();
            hash = hash * 23 + Ticker.GetHashCode();
            return hash;
        }
    }
}

4

1 に答える 1

1

バインディングがどのように機能するかについてのかなり大まかな説明は、xamlクラスがバインドされるプロパティのルックアップテーブルを構築することです。PropertyChangedイベントが発生すると、xamlクラスは、引数に一致するプロパティのルックアップテーブルをチェックし、値を更新します。したがって、PropertyChangedイベントで名前が渡されたプロパティの値のみが更新されます。

実装は次のようになります。

class Security : INotifyPropertyChanged
{   
    public event PropertyChangedEventHandler PropertyChanged;

    public string Ticker 
    { 
        get { return ticker; } 
        set { 
               ticker = value; 
               PropertyChanged(this, new PropertyChangedEventArgs("Ticker"));
        }
    }

    ...// implement the rest of your class like above
 }

詳細については、ここここにあるINotifyPropertyChangedのドキュメントを参照してください。

于 2012-05-05T02:54:22.757 に答える