MVVM方法,ViewModel属性与模型属性

时间:2019-02-25 11:48:02

标签: model architecture viewmodel

当前正在处理Xamarin脱机优先的强制应用程序,我对MVVM体系结构有一个疑问:我的应用程序目前有4种共享解决方案:抽象,核心,DAL和UI(当然还有Platform / iOS和Platform / Droid)。每个解决方案都是不言自明的-抽象包含接口,Core包含所有业务逻辑(事件,模型,ViewModel等),DAL所有DB实体(因为我正在使用Realm,因此我不使用存储库) ,只是每个VM中的普通领域实例),最后是拥有所有UI(duh)的UI。

好吧,回到问题上来……顺带说一句,我说这个:

Order:RealmObject->加载OrderViewModel时,它将调用_realm.All并订阅通知。然后,将每个RealmObject转换为OrderModel并加载到ObservableCollection AllProducts中。效果很好。

现在,在我的AddOrderPage中,我有一个表单,其中包含用于下订单的基本数据。问题是:我的AddOrderPageViewModel应该本身具有每个OrderModel属性还是应该仅使用OrderModel属性?基本上,这是

public class OrderViewModel {

    OrderModel _order;

    public OrderModel Order {
        get => _order;
        set {
            _order = value;
            RaisePropertyChanged(nameof(Order));
        }
    }

    public SaveOrder()
    {
        // do validation
        _realm.Save(_order);
    }
}

或者:

public class OrderViewModel {

    decimal _amount;

    public decimal Amount (...)

    decimal _price;

    public decimal Price (...)

    (...)

    public SaveOrder()
    {
        var order = new Order { ..., _amount, _price);
        // do validation
        _realm.Save(order);
    }
}

乍一看,这听起来可能是一个愚蠢的问题,但我主要担心的是:我应该从模型中提出propertyChanges吗?不会伤害POCO原则吗?例如,如果OrderModel包含一个ObservableCollection(甚至是一个List)_orderDetails,并且在更新时还应该在TotalPrice上引发一个PropertyChanged,是否可以在Model上完成?

1 个答案:

答案 0 :(得分:1)

第一个更适合MVVM,因为该模型不应执行任何逻辑。您正确的是,OrderModel不应具有propertyChanges方法,该方法应位于视图模型中。该模型实际上应该只具有属性和构造函数。任何进一步的逻辑,例如propertyChanged,都将在访问模型的视图模型中