속성이 변경되었는지 쉽게 확인할 수있는 좋은 방법이 있는지 궁금합니다. Child.Name이 변경되었을 때 아래의 계층 구조 (isDirty)와 마찬가지로 알고 싶습니다.(있는 경우) (복잡한) pocomodel의 속성이 변경되었는지 확인하는 쉬운 방법은 무엇입니까?
GrantParent
- Parent
-- Child
제 경우에는 모델을 탐색하여 변경된 사항이 있는지 확인해야합니다.
ps : IChangeTracking
을 사용하고 있습니다.
직렬화 된 객체의 해시를 캐싱하려고 생각했습니다. (너무 느린가?)
변경된 내용을 생성하는 것은 또는 해당 부모가 grantparent에 도달 할 때까지 호출합니다. (수다?)
public class Parent: BaseEntity
{
private Child _child;
public Child Child
{
get { return _child; }
set { _child = value; OnPropertyChanged("Child"); }
}
}
public class Child : BaseEntity
{
private int _id;
public int Id {
get { return _id; }
set { _id = value; OnPropertyChanged("Id"); }
}
}
[DataContract]
[Serializable]
public abstract class BaseEntity : INotifyPropertyChanged
{
protected BaseEntity()
{
PropertyChanged += PropertyChangedEventHandler;
}
private void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e)
{
if (e != null && !String.Equals(e.PropertyName, "IsChanged", StringComparison.Ordinal))
{
this.IsChanged = true;
}
}
protected void OnPropertyChanged<T>(Expression<Func<T>> property)
{
MemberExpression me = property.Body as MemberExpression;
if (me == null || me.Expression != property.Parameters[0]
|| me.Member.MemberType != MemberTypes.Property)
{
throw new InvalidOperationException(
"Now tell me about the property");
}
var handler = PropertyChanged;
if (handler != null) handler(this,
new PropertyChangedEventArgs(me.Member.Name));
}
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool IsChanged
{
get
{
lock (_notifyingObjectIsChangedSyncRoot)
{
return _notifyingObjectIsChanged;
}
}
protected set
{
lock (_notifyingObjectIsChangedSyncRoot)
{
if (!Boolean.Equals(_notifyingObjectIsChanged, value))
{
_notifyingObjectIsChanged = value;
if (IsDirtyChanged != null)
IsDirtyChanged();
this.OnPropertyChanged("IsChanged");
}
}
}
}
private bool _notifyingObjectIsChanged;
private readonly object _notifyingObjectIsChangedSyncRoot = new Object();
public void AcceptChanges()
{
this.IsChanged = false;
}
}
말에서 나는이 (가) 이미 사용 된 XML 시리얼 라이저에서 XML 모델을 비교 사용했다. 한 번 (또는 그 정도) 정도면 충분합니다. 이제 마지막 저장 이후에 가지고있는 XML 모델을 확인합니다.
투명한 프록시. – jgauffin
좀 더 자세히 설명해 주시겠습니까?나는 투명한 프록시에 익숙하지 않다. (비록 그것을 찾을 것입니다) –
여기를보세요 : http://stackoverflow.com/questions/8580307/handling-propertychanging-propertychanged-via-castles-dynamicproxy – jgauffin