당신은 Reflection
를 사용하고 Prism.Mvvm.BindableBase
에서 상속 BindableBaseExtended
같은 것을 만들 수 있습니다.
public class SomeViewModel : BindableBaseExtended
{
private Person model;
public Person Model
{
get { return model; }
set { SetProperty(ref model, value); }
}
public string MyProperty
{
get { return Model.DisplayName; }
set { SetProperty(Model, m => m.DisplayName, value); }
}
}
public class BindableBaseExtended : BindableBase
{
protected virtual bool SetProperty<TClass, TMember>(TClass target, Expression<Func<TClass, TMember>> expression, TMember value, [CallerMemberName] string propertyName = null)
{
var expr = (MemberExpression)expression.Body;
var prop = (PropertyInfo)expr.Member;
var propValue = prop.GetValue(target, null);
if (object.Equals(propValue, value)) return false;
prop.SetValue(target, value, null);
this.RaisePropertyChanged(propertyName);
return true;
}
protected virtual bool SetProperty<TClass, TMember>(TClass target, Expression<Func<TClass, TMember>> expression, TMember value, Action onChanged, [CallerMemberName] string propertyName = null)
{
var expr = (MemberExpression)expression.Body;
var prop = (PropertyInfo)expr.Member;
var propValue = prop.GetValue(target, null);
if (object.Equals(propValue, value)) return false;
prop.SetValue(target, value, null);
onChanged?.Invoke();
this.RaisePropertyChanged(propertyName);
return true;
}
}
그렇다면 값이 다른지 수동으로 확인해야합니까? 공용 문자열 DisplayName { get {return Model.DisplayName; } 세트 { if (Model.DisplayName! = value) { Model.DisplayName = value; OnPropertyChanged(); } } } –
일반적으로 값이 실제로 변경 될 때만 propertychanged 이벤트가 발생하므로 예상을 확인해야합니다. 그러나 데이터 바인딩의 경우에는 아무런 차이가 없습니다. – Liero