使用其setter捕获属性更改

时间:2013-01-22 10:00:33

标签: c# asp.net properties propertychanged

我想在属性更改时收到通知,以便我可以在数据库中记录属性的旧值和新值。

所以我决定采用属性设置器的方法,并使用一个处理所有属性的通用方法。

我创建了以下课程:

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)并保存到数据库?

1 个答案:

答案 0 :(得分:1)

你似乎对财产变更的使用感到困惑 通常,希望对其属性进行观察的组件会更改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));
       }
    }
}

现在,消费者对如何应对财产变化负有责任。这将可观察的组件与一些属性更改时无关的关注分开。通常,会有一些常见的实现 - 以堆叠方式保存当前对象状态以提供撤消 - 重做功能。

因此,在您的情况下,您希望将它们记录到数据库(?),应该有代码可以监听此属性更改事件并执行日志记录。将有一些控制器/绑定代码将遍历实现此接口的所有对象并挂接事件。通常,根级容器会保留这样的内容 - 例如,在设计器表面中,只要创建新组件并将其添加到设计图面,其根元素(或处理根元素的代码)就会挂起事件。 / p>