我正在开发一个项目,我尝试实现MVVM以正确地将业务逻辑与视图分开。尽管我阅读了很多关于这种模式的论文并查看了示例应用程序,但仍然有一些未解答的问题。
我的模型包含一组Documents
,其中包含DocumentObjects
种不同类型的列表。
DocumentObjects
包含计算逻辑,并与Document
进行互动。
然后我有了我的观点和视图模型(Document
各有一个,每种DocumentObjects
都有一个
要以正确的MVVM模式实现此功能,我会让DocumentView
显示DocumentObjects
列表(例如ItemsControl
)。然后,WPF将通过DataTemplate条目选择要使用的正确视图。
此方法存在的问题是,我希望保留Document
,即实际DocumentObjects
的列表,而不是其视图模型。然后,如果我使用DataTemplate来描述用于对象的视图,我无法指定我想使用的viewmodel ...
我的问题是:如何在他们不知道的情况下,在已存在的模型对象上构建“VVM”部件? 或者更现实地说,您如何更改此设计模式以符合MVVM指南?
(我想要的是一种“模型优先”实例化。)
其中一个示例应用,提出了我的问题:在Reed Copsey's blog post on MVVM中:
<DataTemplate DataType="{x:Type model:FeedItem}">
<TextBlock Text="{Binding Path=Title}" />
</DataTemplate>
视图使用FeedItem
直接使用DataTemplate
模型。如果FeedItem
必须有ViewModel
?
(我知道我的设计可能不是最好的,我愿意接受建议!)。
答案 0 :(得分:1)
我并不完全按照您的问题进行操作,但听起来您希望使用一些其他属性来扩充模型,这些属性将显示给您的视图,这就是视图模型的用途。
例如,您的Document
模型的集合可能为Item
:
public class Document
{
public List<Item> Items { get; set; }
}
您希望在视图中呈现每个项目,其中包含一些不属于Item
类型的其他属性。您不希望使用视图所关注的这些附加属性污染您的Item
模型,因此您创建了ItemViewModel
。然后,您通常会创建一个DocumentViewModel
来保存此集合:
public class DocumentViewModel
{
public List<ItemViewModel> ItemViewModels { get; set; }
}
然后,您的视图将绑定到DocumentViewModel
的实例。显然需要一些管道代码,用于将数据传输到Document
和DocumentViewModel
类型。您可以使用AutoMapper等库来帮助实现此目的。
您当然可以确定您的Document
类型已包含所有必需的属性,并且您希望将其直接公开给您的视图。这是DRY和LoD原则之间的平衡,因此您必须考虑这一点。
最重要的是if you're doing MVVM, then you need to use an MVVM framework。这对视图构成也有很大帮助。例如,对于Caliburn.Micro,约定假定您绑定的任何集合是视图模型的集合,它将自动定位相应的视图并将两者绑定在一起。