簡體   English   中英

Prism MVVM ViewModel屬性支持字段作為模型的屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM