MVVM与集合的应用

3
如果我有一个模型,应该包含一个集合,例如书 -> 作者
我该怎么做呢?
像这样:
public class Book
{
    public string Title { get; set; }
    public List<Author> Authors { get; set; }
}

或者更像:
public class Book
{
    public string Title { get; set; }
    public List<AuthorViewModel> Authors { get; set; }
}

哪种方式更常见用于此操作,并且我如何从ViewModel中获取视图?

模型之间管理关系,而不是视图模型之间管理关系,这是肯定的吧? - BoltClock
我的问题是我已经看到了两种方式,所以我在询问。 - Karl_Schuhmann
即使您不想使用框架,我仍建议您查看主要框架的文档或教程,以便您了解其工作原理。这是一种模式,因此有不同的实现方式,“正确”的实现方式取决于您问谁。尝试不同的版本可以让您在某个时刻恍然大悟。我知道我还没有达到那个境界。 - mcalex
3个回答

4
这个肯定是错误的:
public class Book
{
    public string Title { get; set; }
    public List<AuthorViewModel> Authors { get; set; }
}

但这样是可以的:
public class BookViewModel
{
    public string Title { get; set; }
    public List<AuthorViewModel> AuthorModels { get; set; }
}

1
根据M-V-VM模式,低层级不应知道高层级的存在。视图只知道ViewModel并绑定到其属性。ViewModel知道Model(并公开与其相关的属性),但不知道View。
同样,Model不知道ViewModel。因此,一个Book有Authors,而一个BookViewModel可以知道Books、Authors,并且甚至可以调用(通过中介)AuthorViewModels。但是,一个Book不应该知道任何ViewModel。
希望这对您有所帮助。

所以第一个是正确的,第二个不是编程的。在MVVM之后,如果我理解正确的话,但是在这个例子中我该如何调用? - Karl_Schuhmann
你是什么意思,调用?你的 BookViewModel 将有一个作者列表作为其属性之一。所有工作都在 ViewModel 中完成。 - mcalex
如果我在我的收藏中点击一个作者,我会为他获得NotifyPropertyChanged,然后我该怎么做?AuthorViewModel AVM = new AuthorViewModel(); AVM.add(Author); - Karl_Schuhmann
如果作者存在,那么使用update(Author)会更有意义。AuthorVM定位到Author对象并进行更改,然后您的数据服务(例如存储库)将执行实际的数据库持久化操作。 - mcalex
但是 AuthorViewModel 不知道所选的 Author,所以我必须先添加他,然后才能更新 Author - Karl_Schuhmann

0

这取决于您的模型是否包含足以呈现视图的属性。如果您需要使用特定于视图的代码来增强它们,并且不想用这些附加属性污染您的模型,那么您将创建一个视图模型。

如果您希望,您可以将模型(Book)公开为视图模型(BookViewModel)的属性,尽管纯粹主义者会说您应该创建一个包装器属性,该属性对每个模型属性都委托给模型。

我不确定您所说的“如何从视图模型中获取视图”的意思是什么,但是如果您正在使用MVVM设计模式,则应该使用MVVM框架。例如,如果您首先使用视图模型,则会实例化您的视图模型并使用Caliburn.Micro查找视图并将两者绑定在一起。


我不想使用这样的框架,因为我想自己知道如何做这样的事情。 - Karl_Schuhmann
无论您使用何种方法将视图模型绑定到视图,您都可以使用。例如,您可能会将视图模型作为视图中的资源(这将是一种视图优先的方法)。但是,这是一个与您所问的问题分开的问题,即是否使用模型或视图模型,正如我所说,这取决于您的模型是否具有足够的信息来呈现视图。您可能会决定始终使用视图模型,但无论如何,您的模型都不应该引用视图模型,但相反是可以接受和必需的。 - devdigital

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接