【问题标题】:Instanciation of ViewModels an Views on top of existing model objects在现有模型对象之上实例化 ViewModel 和 View
【发布时间】:2013-05-29 09:07:59
【问题描述】:

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

我的模型由一组 Documents 组成,其中包含不同类型的 DocumentObjects 列表。

DocumentObjects 包含计算逻辑,并与彼此以及与Document 进行交互。

然后我有我的视图和视图模型(Document 各一个,DocumentObjects 各一个)

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

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

我的问题是:如何在他们不知道的情况下在现有模型对象之上构建“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 怎么办?

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

【问题讨论】:

    标签: c# wpf design-patterns mvvm instantiation


    【解决方案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,约定假定您绑定到的任何集合都是视图模型的集合,它会自动定位相应的视图并将两者绑定在一起。

    【讨论】:

    • 感谢您的回答。虽然这不是我想要的(我承认我的问题不是最清楚的),但我还是听从了您的建议并开始使用 Caliburn.Micro 来处理繁重的 MVVM 工作的一部分。一会儿我看看它是否适合我的需要!
    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2016-01-08
    • 2015-07-01
    相关资源
    最近更新 更多