protected virtual object GetValue() { Type targetType = null; if (Member != null && Source != null) { var view = Source as IDataContext <object>; if (view != null && view.DataContext != null) { DataContextSource = view.DataContext; DataContextMember = DataContextSource.GetType().GetMember(Member.Name).FirstOrDefault(); if (DataContextMember != null) { targetType = Member.GetMemberType(); var dataContextValue = DataContextMember.GetValue(DataContextSource); return(Convert(dataContextValue, Type, ValueConverter)); } } var value = Member.GetValue(Source); return(value); } return(ConvertValue(_Value, targetType)); }
protected virtual void SetValue(object value) { var shouldSetHandlers = false; object oldValue = null; UnconvertedValue = value; var convertedValue = value; if (_DataContextValue != value || _Value != value) { if (_DataContextValue != value) { if (DataContextMember != null) { var targetType = DataContextMember.GetMemberType(); convertedValue = ConvertbackValue(value, targetType); oldValue = DataContextMember.GetValue(DataContextSource); if (oldValue != value) { shouldSetHandlers = true; if (DataContextMember.CanWrite()) { DataContextMember.SetValue(DataContextSource, convertedValue); } } _DataContextValue = convertedValue; } } if (_Value != convertedValue) { var targetType = Member.GetMemberType(); convertedValue = ConvertValue(value, targetType); oldValue = Member.GetValue(Source); if (oldValue != value) { shouldSetHandlers = true; if (Member.CanWrite()) { Member.SetValue(Source, convertedValue); } } _Value = convertedValue; } } if (shouldSetHandlers) { AddNotifyCollectionChangedHandler(value, this); AddNotifyPropertyChangedHandler(DataContextSource, this); AddNotifyPropertyChangedHandler(Source, this); } Type = Member.GetMemberType(); Id = CreateId(); }