【问题标题】:MVVM approach, ViewModel properties vs Model propertiesMVVM 方法,ViewModel 属性与模型属性
【发布时间】:2019-02-25 11:48:01
【问题描述】:

目前正在开发一个离线优先的 Xamarin sale's force 应用程序,我有一个关于 MVVM 架构的问题:我的应用程序目前有 4 个共享解决方案:Abstraction、Core、DAL 和 UI(当然还有 Platform/iOS 和 Platform/机器人)。每个解决方案都是不言自明的——抽象包含接口,核心包含所有业务逻辑(事件、模型、视图模型等),DAL 所有数据库实体(因为我正在使用领域,所以我没有使用存储库,只是每个 VM 中的普通领域实例),最后是 UI,它包含所有 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 上这样做是否正确?

【问题讨论】:

  • 我建议您实现一个可以调用 INotifyProperty 方法的 ViewModelBase。此外,如果您正在开发一个大型应用程序,您可能应该考虑实现一个 MVVM 助手。我使用并推荐 prism,他们有大量很好的示例和视频,向您展示了构建 mvvm xamarin 应用程序的最佳实践!
  • 您好,@Axemasta!实际上,这只是一个示例代码。巧合的是,我正在使用 Prism,所以,所有方法都使用 SetProperty ;)
  • 嗨@Fábio 很高兴听到您正在使用 MVVM 助手。如果您转到 prism 的 youtube 频道(我不会链接以防链接失效),他们有一个名为“使用代表命令”的视频。该视频向您展示了使用视图模型的 getter/setter 的最佳实践。您可以将实体保存在设置器中,但它可能会变得非常混乱,如果您想这样做,您需要对它们进行空检查,否则您可能会遇到破坏视图模型的问题(绑定将在其值为空时更新)。不过,Prism 已经为您介绍了,他们的视频、文档和操作系统贡献很棒,请关注他们!
  • 嘿,@Axemasta,感谢您的提示。我花了一些时间观看视频,它真的很有用,我打算尽快观看更多视频。
  • Prism 实际上有一个私人 slack 组,您可以通过在他们的 patreon 上承诺 1 美元之类的东西来访问它。它非常有用,而且小组中的人(不仅仅是维护者)知识渊博且乐于助人。

标签: model architecture viewmodel


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2013-06-13
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多