我想在属性更改时收到通知,以便我可以在数据库中记录属性的旧值和新值。
所以我决定采用属性设置器的方法,并使用一个处理所有属性的通用方法。
我创建了以下课程:
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)
并保存到数据库?答案 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>