【发布时间】:2011-05-07 17:30:19
【问题描述】:
据我了解,ViewModel 通过数据绑定与 View 进行通信。但是如何在 ViewModel 中创建 UIElements for View。
谢谢。
【问题讨论】:
据我了解,ViewModel 通过数据绑定与 View 进行通信。但是如何在 ViewModel 中创建 UIElements for View。
谢谢。
【问题讨论】:
ViewModel 不应直接创建任何 UIElement,因为 ViewModel 不应依赖于 View。 ViewModel 提供 View(即 UIElements)可以绑定的数据。
如果您的问题是针对如何引导视图,有两种方法:视图优先和视图模型优先。在前者中,您首先创建 View,然后创建并绑定 ViewModel。在后者中,您让 ViewModel 创建 View(通过接口)。阅读更多关于它的信息here。
如果您的问题是针对组成 UIElements 的视图,这是通过 DataBinding 以及使用 DataTemplates 和 ControlTemplates 来完成的。
【讨论】:
MVVM 是一种松散的设计模式,只要纯粹只关注 UI,将代码放在代码后面是可以接受的,但请记住,它可能更难进行单元测试。
严格来说,ViewModel 不与 View 通信,ViewModel 中没有对 View 的引用,而是 View 从 ViewModel 读取数据并在 ViewModel 上执行命令。
【讨论】:
问题是我看到的动态组件创建需求。
您可以将 Container 对象放在视图上,然后在 modelView 上创建 UIElements 并将此 UIElement 集合绑定到 Container 的 Content 属性。但我认为这不是一个好习惯。这种方法打破了模型和视图的分离。所以你需要避免动态组件的创建。
MVVM 方法有点不同。有时强迫我们使用技巧。即不是使用 ListBox 的 MemberPath 属性,而是定义一个 ItemTemplate 并将 ButtonBase 元素放在模板上以支持命令!或者你扩展 ListBox 并支持命令。
我的提议而不是动态对象创建。使用 DataTemplates 并更改 ModelView 上的绑定成员,然后将自动为您创建视图。对于复杂的 senario 可能很难。我们这样做都是为了保持 MVVM 结构。
【讨论】: