在现有模型对象之上实例化ViewModel和Views

时间:2013-05-29 09:07:59

标签: c# wpf design-patterns mvvm instantiation

我正在开发一个项目,我尝试实现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

,怎么办?

(我知道我的设计可能不是最好的,我愿意接受建议!)。

1 个答案:

答案 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的实例。显然需要一些管道代码,用于将数据传输到DocumentDocumentViewModel类型。您可以使用AutoMapper等库来帮助实现此目的。

您当然可以确定您的Document类型已包含所有必需的属性,并且您希望将其直接公开给您的视图。这是DRY和LoD原则之间的平衡,因此您必须考虑这一点。

最重要的是if you're doing MVVM, then you need to use an MVVM framework。这对视图构成也有很大帮助。例如,对于Caliburn.Micro,约定假定您绑定的任何集合是视图模型的集合,它将自动定位相应的视图并将两者绑定在一起。