gpt4 book ai didi

c# - 在现有模型对象之上实例化 ViewModels 和 Views

转载 作者:太空宇宙 更新时间:2023-11-03 13:41:31 25 4
gpt4 key购买 nike

我正在从事一个项目,我尝试实现 MVVM 以正确地将业务逻辑与 View 分开。尽管我阅读了很多关于此模式的论文并查看了示例应用程序,但我仍然有一些 Unresolved 问题。

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

DocumentObjects 包含计算逻辑并相互交互并与 Document 交互。

然后我有我的 View 和 View 模型(Document 各一个,每种 DocumentObjects 各一个)

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

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

我的问题是:如何在现有模型对象之上构建“VVM”部分,而不让他们知道?或者更现实地说,您将如何更改此设计模式以符合 MVVM 准则?​​

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

其中一个示例应用提出了我的问题:Reed Copsey's blog post on MVVM 中:

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

FeedItem 模型由使用 DataTemplate 的 View 直接使用。如果 FeedItem 必须有一个 ViewModel 怎么办?

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

最佳答案

我没有完全理解你的问题,但听起来你想用一些你将要暴露给你的 View 的额外属性来扩充模型,这就是 View 模型的用途。

例如,您可能有一个 Document 模型,其中包含 Item 的集合:

public class Document
{
public List<Item> Items { get; set; }
}

您希望使用 Item 类型中没有的一些附加属性来呈现 View 中的每个项目。您不想用 View 关注的这些附加属性污染您的 Item 模型,因此您创建了一个 ItemViewModel。然后,您通常会创建一个 DocumentViewModel 来保存此集合:

public class DocumentViewModel
{
public List<ItemViewModel> ItemViewModels { get; set; }
}

然后您的 View 将绑定(bind)到您的 DocumentViewModel 实例。显然需要一些管道代码来将数据传入和传出您的 DocumentDocumentViewModel 类型。您可以使用诸如 AutoMapper 之类的库来帮助这个。

您当然可以决定您的 Document 类型已经包含所有必需的属性,并且您希望将它直接暴露给您的 View 。这是 DRY 和 LoD 原则之间的平衡,因此您必须考虑这一点。

不过最重要的是 if you're doing MVVM, then you need to use an MVVM framework .这对 View 组合也有很大帮助。例如 Caliburn.Micro ,约定假定您绑定(bind)到的任何集合都是 View 模型的集合,它会自动定位相应的 View 并将两者绑定(bind)在一起。

关于c# - 在现有模型对象之上实例化 ViewModels 和 Views,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16809789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com