棱镜 MVVM 视图模型属性支持字段作为模型的属性



我是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); }

"属性或索引器不得以输出或参数参数传递"。

那么我应该如何做?

您需要手动抬起上propertychanged并在没有助手的情况下进行设置。

  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;
    }
}

最新更新