我有viewmodel1和viewmodel2。
Viewmodel1需要显示模型中包含的某种列表中的数据。 Viewmodel2需要将数据输入到模型中包含的列表中。
因此,Viewmodel1和Viewmodel2都需要“了解”模型。
在MVVM中执行此操作的正确方法是什么?
我应该在app中创建模型并为viewmodel1和viewmodel2提供对它的引用或?
答案 0 :(得分:2)
如果我将ViewModel视为一个仅为View翻译的模型,我觉得它会有所帮助。
您有几个选择:
创建一个控制器,用于设置ViewModel。如果ViewModel需要来自多个地方的信息,这通常是一个不错的选择。您可以为ViewModel提供所需信息的引用,也可以将其设置为Plain Old .NET Object(PONO)并让控制器为您设置它。
只需按照建议将引用传递给ViewModel。如果不同类之间不需要交互,则非常有用
连接EventAggregator,可用于在模型更改时发布通知,并将Repository传递给ViewModel,以便每个人都可以去获取/存储他们需要时建模。
我非常喜欢最后一个模式,因为如果您发现需要更多的演示者或控制器可以访问这些模型,它很容易扩展。它还允许您注入存储库,这意味着您可以在以后更轻松地迁移到一个很好的RESTful面向服务的体系结构。
如果您之前没有做过多次依赖注入,请考虑通过构造函数进行。这将帮助您避免在事情发生之前尝试使用ViewModel的情况,并让ViewModel自行完成工作。您可能还想查看Unity或Castle Windsor等框架,这些框架可以帮助您进行此类布线,但这仅适用于大型企业项目(甚至不是所有项目)。
答案 1 :(得分:2)
这很好。 Models
意味着他们的声音:数据模型。它们意味着是保存数据的虚拟对象,应用程序的其余部分可以根据需要使用它们。
ViewModels
是反映View的模型。例如,假设您有LoginViewModel
和ManageUsersViewModel
。两个ViewModel都可以使用UserModel
数据对象,但是它们完全不同于ViewModel。
在大多数情况下,我会负责将Models
加载到ViewModel
。例如,您通常不会在用户登录之前预加载用户列表,因此您可以使用其User对象。 Insetad,您的LoginViewModel
将自己进行数据库调用以获取用户登录的用户模型,而ManagerUsersViewModel
将进行自己的数据库调用以获取可修改的用户列表。 / p>
答案 2 :(得分:0)
你必须以错误的方式思考..在MVVM中,你的模型一直包含在ViewModel中,直到视图..假设有一个ObservableCollection,那么你的viewmodel中会有一个属性,你应该在构造函数/ ViewModel的一些方法中初始化这个集合。两个viewmodels都会初始化这样的ProductTypes。在我看来你应该尝试创建Classed For Model,ViewModel,Repository并在其中使用IoC ..
这是关于mvvm的一个非常好的视频你应该试试这个视频并看看代码。
http://blog.lab49.com/archives/2650
如果你提到的List是永远不会改变的,你应该尝试为此创建一个单独的ViewModel,并在其他viewmodel中引用该viewmodel。
问候。