[英]Prism MVVM ViewModel property backing field as model's property
我是Prism MVVM的新手,並嘗試創建具有模型屬性后備字段的ViewModel屬性。
public class SomeViewModel : BindableBase, INavigationAware
{
private Person model;
public Person Model
{
get { return model; }
set { SetProperty(ref model, value); }
}
public string DisplayName
{
get { return Model.DisplayName; }
set { SetProperty(ref Model.DisplayName, value); }
}
但是它會在以下行生成編譯器錯誤:
set { SetProperty(ref Model.DisplayName, value); }
“屬性或索引器不能作為out或ref參數傳遞”。
那我該怎么做呢?
您需要手動提高OnPropertyChanged並將其設置為沒有助手。
public string DisplayName
{
get { return Model.DisplayName; }
set
{
Model.DisplayName = value;
OnPropertyChanged();
}
}
您可以使用Reflection
並創建類似BindableBaseExtended
東西,該東西繼承自Prism.Mvvm.BindableBase
。
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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.