MVVM模式中的Modelview到View

3
据我了解,ViewModel 通过数据绑定与 View 进行通信。但是,如何在 ViewModel 中为 View 创建 UI 元素呢?
谢谢。
3个回答

6
ViewModel不应直接创建任何UI元素,因为ViewModel不应依赖于View。ViewModel提供数据,而View(即UI元素)可以绑定这些数据。 如果您的问题是关于如何引导视图,则有两种方法:View-first和ViewModel-first。在前者中,您首先创建View,然后创建并绑定ViewModel。在后者中,您使ViewModel通过接口创建View。了解更多信息,请单击此处。 如果您的问题是关于组合UI元素的视图,则可以通过DataBinding和使用DataTemplates和ControlTemplates来完成。

我确实更喜欢 View(例如在 App.xaml 中)创建第一个 ViewModel 的方法,因为这样可以使所有引用直接从 View 指向“较低”级别的代码。 - David Schmitt
当正确使用DIP时,ViewModel-first同样适用。我更喜欢ViewModel-first,因为UI的流程通常由业务规则驱动。 - bitbonk

2

MVVM是一种松散的设计模式,只要代码仅涉及UI,将代码放在代码后台是可以接受的,但请记住,这可能更难进行单元测试。

严格地说,ViewModel不与View通信,在ViewModel中没有对View的引用,而是View从ViewModel读取数据并在ViewModel上执行命令。


0

问题是需要动态创建组件。

您可以在视图上放置一个容器对象,然后在modelView上创建UI元素,并将此UI元素集合绑定到容器的内容属性。但我认为这不是一种好的做法。这种方法会破坏模型和视图的分离,因此您需要避免动态组件的创建。

MVVM方法有所不同。有时候我们需要使用一些小技巧,例如:不使用ListBox的MemberPath属性,而是定义一个ItemTemplate,在模板上放置ButtonBase元素以支持命令!或者您可以扩展ListBox并支持命令。

我的建议是使用DataTemplates而不是动态对象创建。更改ModelView上绑定的成员,然后就会自动为您创建视图。对于复杂情况可能会有一些困难,但我们都在为了保持MVVM结构而努力。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接