【问题标题】:mvvm questions : definition of model, wrapping model objects and modal dialogmvvm 问题:模型的定义、包装模型对象和模态对话框
【发布时间】:2009-08-12 01:23:34
【问题描述】:

我对 mvvm 还很陌生,我有几个问题:

模型=业务层吗?

如果我有一个包含订单列表和一个或多个订单的客户模型,每个订单都包含项目列表,您将如何在视图中将其分开?目前,我的 CustomerModel 有一个 CustomerViewModel。 CustomerViewModel 包含 OrderViewModel 列表。 OrderViewModel 包含 ItemsViewModel 的列表。因此,例如,如果我从数据层检索现有客户,我将根据现有列表创建适当的 OrderViewModel 和 ItemViewModel。这就是你通常实现 mvvm 的方式吗?老实说,整个“重新包装对象”感觉不太对。

我的客户视图包含订单和项目列表,每个都由其自己的用户控件表示并使用 ItemsControl 重复。每个项目都有自己的添加、编辑和删除按钮。我想要某种模式对话框,当用户以适当的形式呈现时,它会禁用当前选项卡(而不是整个应用程序)。我找到的最简单的解决方案是创建一个内容控件,该控件具有一个控件 dp(名为 Control),您可以设置该控件并在 isVisible = true 时自动创建矩形覆盖。然后控件绑定到 CustomerViewModel 的 dialogControl 属性...。我不认为这是一个合适的 mvvm 解决方案,因为我似乎在混淆视图模型和视图。我认为更合适的方法是在 customerviewmodel 中有一个 viewmodel 代表对话框包含的内容并在每个 viewmodel 中为它提供一个模板....但我似乎无法想出一种方法来实现矩形覆盖这个解决方案。

谢谢!

【问题讨论】:

    标签: mvvm


    【解决方案1】:

    我也一直在为这个想法争论不休。似乎您必须在模型和视图模型之间重复自己。主要原因是Model倾向于传统的对象,而ViewModel实现了INotifyPropertyChanged。对我来说,这就是区别——ViewModel 支持双向绑定。

    一旦我这样想,模型就变成了可选的。就我而言,模型通常是我引入的一些库代码,或者是生成的数据访问层。或者换句话说,ViewModel 包含功能,Model 是后备存储。

    我什至停止调用我的 ViewModel 类 xxxViewModel 或 xxxVM。现在他们只是xxx。但是,它们都是从 IViewModel 实现的,而 IViewModel 本身只是继承自 INotifyPropertyChanged。

    就您对用户控件的使用而言,我已经能够在视图中仅使用 DataTemplates。对于您的选项卡,选项卡的 ViewModel 应启动模式对话框,同时应在对话框打开时将 Enabled 属性设置为 false。当您的选项卡 View 看到 Enabled 属性为 false 时,它​​应该自行禁用。

    【讨论】:

    • 我同意您的定义以及 ViewModel 和 Model 之间的区别,但是对于需要通过绑定公开的 Model 级别维护的属性,您会怎么做?模型层可以实现 INotifyPropertyChanged 吗?如果不能,您将如何获得模型上的属性以将更改冒泡到视图?
    • @ScottCher:这确实是一个架构问题。根本没有办法自动将所有对普通旧对象的更改冒泡到包装它的 ViewModel,除非您定义事件来执行此操作。就我而言,我使用的是不可变模型对象,所以我没有这个问题。 ;)
    猜你喜欢
    • 2012-06-08
    • 2012-08-31
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多