Model MVVM方法,视图模型属性与模型属性

Model MVVM方法,视图模型属性与模型属性,model,architecture,viewmodel,Model,Architecture,Viewmodel,目前正在开发离线first Xamarin sale的force应用程序,我有一个关于MVVM架构的问题:我的应用程序目前有4个共享解决方案:抽象、核心、DAL和UI,当然还有平台/iOS和平台/Droid。每个解决方案都是不言自明的——抽象包含接口,核心包含所有业务逻辑事件、模型、视图模型等,所有DB实体,因为我使用的是领域,我没有使用存储库,只是每个VM中的纯领域实例,最后是UI,它包含了所有的UI 那么,回到问题上来。。。现在,假设我有: Order:RealmObject->加载Orde

目前正在开发离线first Xamarin sale的force应用程序,我有一个关于MVVM架构的问题:我的应用程序目前有4个共享解决方案:抽象、核心、DAL和UI,当然还有平台/iOS和平台/Droid。每个解决方案都是不言自明的——抽象包含接口,核心包含所有业务逻辑事件、模型、视图模型等,所有DB实体,因为我使用的是领域,我没有使用存储库,只是每个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);
    }
}
或:


乍一看,这可能听起来是一个愚蠢的问题,但我主要关心的是:我是否应该从模型中提出财产变更?这不损害POCO原则吗?例如,如果OrderModel包含一个ObservableCollection,甚至是一个List\u orderDetails,当它被更新时,它还应该在TotalPrice上增加一个属性Changed,那么在Model上执行是否正确?

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

我建议您实现一个可以调用INotifyProperty方法的ViewModelBase。此外,如果您正在开发一个大型应用程序,您可能应该考虑实现一个MVVM助手。我使用并推荐prism,他们有大量优秀的示例和视频,向您展示了构建mvvm xamarin应用程序的最佳实践!你好,@Axemasta!实际上,这只是一个示例代码。巧合的是,我使用的是Prism,所以,所有方法都使用SetProperty;您好@Fábio很高兴听到您正在使用MVVM帮助程序。如果你转到prism的youtube频道,我不会链接,因为一旦链接失效,他们会有一个名为“使用代理命令”的视频。本视频向您展示了使用视图模型的getter/setter的最佳实践。您可以将实体保存在setter中,但它可能会变得非常混乱,如果要执行此操作,您需要对它们进行null检查,否则您可能会遇到问题。当viewmodel绑定的值变为null时,它们将更新。Prism已经介绍过你了,他们的视频、文档和操作系统的贡献都很棒,去关注他们吧!嘿,@Axemasta,谢谢你的提示。我花了一段时间看了这段视频,它真的很有用,我计划尽快看更多的。Prism实际上有一个私人的slack group,你可以通过在他们的patreon上认捐1美元来获得它。这是非常有用的,而且团队中的精力充沛的人,不仅仅是维护人员,都非常有知识和帮助。
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);
    }
}