5

INotifyPropertyChanged使用して実装しましたCallerMemberName

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
 if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

したがって、これは任意のプロパティのセッターで呼び出すことができます -OnPropertyChanged()これは、設定されているときはいつでもプロパティ変更イベントを通知します。これは、getter のみのプロパティには当てはまりません。例えば、

private DateTime _dob;
public DateTime DateOfBirth
{
    get
    {
        return _dob;
    }
    private set
    {
        _dob = value;
        OnPropertyChanged();
        OnPropertyChanged("Age");
    }
}

public int Age
{
    get
    {
        return DateTime.Today.Year - _dob.Year;
    }
}

OnPropertyChanged()OnPropertyChanged("Age")DateOfBirth では問題なく動作しますが、Age が変更されたことを通知するには、 のセッター内で呼び出すことを忘れないでくださいDateOfBirth。これにより、コードを長期間維持することが難しくなっていると思います。新しいプロパティが Age に依存する場合は、DateOfBirth のセッターでも通知する必要があります。OnPropertyChanged("Age") を呼び出さずにこれを行うより良い方法はありますか?

4

2 に答える 2

5

依存プロパティが同じクラスにある限り、Poma のアプローチを使用できますが、依存プロパティが異なるクラスにある場合、そのアプローチでは難しくなります。

私の意見では、PropertyChanged リスナーを追加することは、概念的に正しいことです。

この場合、それは次のようなものになります

コンストラクターで:

this.PropertyChanged += new PropertyChangedEventHandler(SubPropertyChanged);

そして外側:

private void SubPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "DateOfBirth")
    {
       OnPropertyChanged("Age");
    }
}

これは、完全に異なる場所に依存プロパティがあり、ソース クラスを変更できない場合にも機能します。

于 2014-07-05T06:35:58.950 に答える
-4

これを行う 1 つの方法は、属性を定義し、リフレクションをOnPropertyChanged行ってすべての依存プロパティに通知することです。リフレクションは非常に遅いため、クラス初期化子でのみリフレクションを使用する属性をキャッシュすることができます。

private DateTime _dob;
public DateTime DateOfBirth
{
    get
    {
        return _dob;
    }
    private set
    {
        _dob = value;
        OnPropertyChanged();
    }
}

[DependsOnProperty("DateOfBirth")]
public int Age
{
    get
    {
        return DateTime.Today.Year - _dob.Year;
    }
}
于 2014-07-02T16:12:23.677 に答える