1

プロパティの古い値と新しい値をデータベースに記録できるように、プロパティが変更されたときに通知を受け取りたいです。

そこで、プロパティセッターのアプローチを採用し、すべてのプロパティを処理するジェネリックメソッドを使用することにしました。

私は以下のクラスを作成しました:

public class PropertyChangedExtendedEventArgs<T> : PropertyChangedEventArgs
{
    public virtual T OldValue { get; private set; }
    public virtual T NewValue { get; private set; }

    public PropertyChangedExtendedEventArgs(string propertyName,
                                            T oldValue, T newValue)
        : base(propertyName)
    {
        OldValue = oldValue;
        NewValue = newValue;

   //write to database the values!!!
    }
}

そして私の財産では、私はそれをそのように呼んでいます:

private string _surname;
public string Surname
{
    get { return _surname; }
    set 
    {
        string temp = Surname;
        _surname = value;
        Helper.PropertyChangedExtendedEventArgs("Surname", temp, value);
    }
}

しかし、ジェネリックを扱うのは初めてなので、懸念はほとんどありません:

  • 私の財産でこれをどのように呼ぶのですか?
  • これは良いアプローチですか?
  • パブリックで関数を呼び出し PropertyChangedExtendedEventArgs(string propertyName, T oldValue, T newValue)てデータベースに保存することはできますか?
4

1 に答える 1

3

プロパティ変更の使用法に少し混乱しているようです。
通常、コンポーネントのプロパティ変更INotifyPropertyChangedインターフェイスを監視できるようにする必要があります。したがって、そのような正しい実装は次のようになります

private string _surname;
public string Surname
{
    get { return _surname; }
    set 
    {
        if (_surname != value) // IMP: you want to inform only if value changes
        {
           string temp = Surname;
           _surname = value;

           // raise property change event, 
           NotifyPropertyChanged(temp, _surname);
        }
    }
}

通常、基本実装は、イベントを発生させるヘルパー実装を提供できます。たとえば、

public abstract Component : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged<T>(T oldVal, T newVal, [CallerMemberName] String propertyName = "")
    {
       var e = PropertyChanged;
       if (e != null)
       {
          e(this, new PropertyChangedExtendedEventArgs(propertyName, oldVal, newVal));
       }
    }
}

現在、プロパティの変更にどのように対応するかについては、消費者の責任です。これにより、一部のプロパティが変更されたときに何をすべきかという無関係な懸念から、監視可能なコンポーネントが分離されます。通常、現在のオブジェクトの状態を積み重ねて保存し、元に戻す/やり直す機能を提供するという一般的な実装がいくつかあります。

したがって、あなたの場合、データベースにログを記録したい場合 (?)、このプロパティ変更イベントをリッスンしてログを記録するコードが必要です。このインターフェイスを実装するすべてのオブジェクトを反復処理し、イベントをフックするコントローラー/バインディング コードがいくつかあります。通常、ルート レベル コンテナーはこのようなハウスキーピングを行います。たとえば、デザイナー サーフェイスでは、新しいコンポーネントが作成されてデザイン サーフェイスに追加されるたびに、そのルート要素 (またはルート要素を処理するコード) がイベントをフックします。

于 2013-01-22T10:20:08.500 に答える