2

我正在做一个项目,我尝试实现 MVVM 以正确地将业务逻辑与视图分开。尽管我阅读了很多关于这种模式的论文并查看了示例应用程序,但我仍然有一些悬而未决的问题。

我的模型包含一组包含不同种类Documents的列表。DocumentObjects

它们包含计算DocumentObjects逻辑,并且相互之间以及与Document.

然后我有我的 Views 和 ViewModels (每个Document一个,每个一个DocumentObjects

为了以正确的 MVVM 模式实现这一点,我会让我DocumentView显示DocumentObjects列表(ItemsControl例如)。然后,WPF 将通过 DataTemplate 条目选择要使用的正确视图。

这种方法的问题是我想在我Document的 , 列表中保留实际DocumentObjects而不是他们的视图模型。然后,如果我使用 DataTemplate 来描述用于对象的视图,我无法指定我希望使用的视图模型......

我的问题是:如何在他们不知道的情况下在已经存在的模型对象上构建“VVM”部分?或者更现实地说,您将如何更改此设计模式以符合 MVVM 指南?

(我想要的是一种“模型优先”的实例化。)

其中一个示例应用程序引发了我的问题:Reed Copsey 关于 MVVM 的博客文章中

<DataTemplate DataType="{x:Type model:FeedItem}">
    <TextBlock Text="{Binding Path=Title}" />
</DataTemplate>

FeedItem模型由视图直接使用,使用DataTemplate. 如果FeedItem必须有一个ViewModel怎么办?

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

4

1 回答 1

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 原则之间的平衡,因此您必须考虑这一点。

最重要的是,如果你在做 MVVM,那么你需要使用 MVVM 框架。这对视图合成也有很大帮助。例如对于Caliburn.Micro,约定假定您绑定到的任何集合都是视图模型的集合,它会自动定位相应的视图并将两者绑定在一起。

于 2013-05-29T09:41:13.867 回答