2009-08-12 75 views
1

我是相当新的MVVM,我有几个问题:MVVM问题:模型的定义,包装模型对象和模态对话框

是模型=业务层?

如果我有一个客户模型,其中包含订单列表和订单,每个订单都包含项目列表,那么您如何将它在视图中分开?目前,我的CustomerModel有一个CustomerViewModel。 CustomerViewModel包含OrderViewModel的列表。 OrderViewModel包含ItemsViewModel的列表。因此,如果我从数据层中检索现有客户,那么我会根据现有列表创建合适的OrderViewModel和ItemViewModel。这是你通常如何实现mvvm?说实话,整个“重新包装的对象”并不真的感觉正确。

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

谢谢!

回答

0

我也一直在争论这个想法。看起来你必须在Model和ViewModel之间重复自己。这样做的主要原因是模型往往是一个传统的对象,ViewModel实现INotifyPropertyChanged。对我来说,这是不同之处 - ViewModel支持双向绑定。

一旦我想到这一点,那么模型就成为可选的。在我的情况下,模型通常是我带入的一些库代码或生成的数据访问层。或者换句话说,ViewModel包含了功能,Model是后备存储。

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

就用户控件的使用而言,我只能使用DataTemplates来获取视图。对于选项卡,选项卡的ViewModel应启动模式对话框,同时应在打开对话框时将Enabled属性设置为false。当它看到Enabled属性为false时,您的选项卡视图应该禁用它自己。

+0

我同意你的定义以及ViewModel和Model之间的区别,但是你对在Model级别维护的属性做什么需要通过绑定来公开?模型层是否可以实现INotifyPropertyChanged,如果不是,您将如何获得模型上的属性以将视图更改为视图? – ScottCher 2010-03-15 15:21:12

+0

@ScottCher:这确实是一个架构问题。没有办法自动将所有更改自动引发到一个普通的旧对象,直到包装它的ViewModel,除非您定义事件来做到这一点。在我的情况下,我使用不可变的模型对象,所以我没有这个问题。 ;) – 2010-03-21 17:56:24