【发布时间】:2013-09-01 14:25:08
【问题描述】:
我目前正在尝试围绕MVVM-Pattern 前进。此外,我使用PRISM 来支持 IoC 等。但有一点(除其他外)特别是,我对自己的做法感到不舒服,因为这对我来说似乎有点奇怪,所以可能我没听懂。
假设我想创建一个 ListView 来显示数据库架构的一部分。因此,在“顶级”上,每个数据库都有一个元素。在这些元素中,我想显示该数据库中的表以及该表的列名。
我现在这样做的方式是创建 3 个视图模型(+1 Base-ViewModel 用于托管 ListView 的视图)。 ListView 的每个“层”一个。所以我会有 f.e.一个DatabaseViewViewModel、一个DatabaseTableViewViewModel和一个DatabaseTableColumnViewViewModel(这里的名字不太热)。
所以 Base-ViewModel 有一个 DatabaseViewViewModels 的 ObservableCollection,DatabaseViewViewModel 有一个 DatabaseTableViewViewModels 的 ObservableCollection 等等。
显然,这些视图模型需要一些配置数据(DatabaseTableViewViewModel f.e. 需要知道它的数据库)。在我看来,一个对象应该在创建后完全初始化,所以我想在构造函数中传递该数据。当然,这使得从 IoC 容器中解析这些视图模型成为不可能。但我“必须”解决它,因为它们有一些依赖项需要解决(例如 IEventAggregator)。
据我所知,处理此问题的(或至少一种)方法是使用Factories 创建视图模型,但我对这种布局不太满意。它似乎有点“过大”。
所以我想问你,我是否可能忽略了一些事情。
我的视图模型设计是否有效?或者您将如何为这种“分层”ListView 设计您的视图模型?
编辑:澄清:我创建这 3 个不同的视图模型的原因是,我认为它有点混乱(事实上,我很难想出一个想法当您尝试在层次结构中进一步暴露对象的属性(例如列名)以进行数据绑定时,我完全不知道如何实现这一点。
当然,我可以在我的模型类中使用依赖属性或实现INotifyPropertyChanged——这实际上可能是一个新项目的好方法——但假设你有一个模型,那是不可能的很容易修改。
Edit2:关于 Sheridan 对怪异视图模型类的评论,这是因为在我正在开发的应用程序中,数据库架构是我的数据。我没有处理数据库中的实际数据。 (我正在为 Microsoft 的 Forefront Identy Manager 开发一个 MySQL 管理代理。该管理代理需要知道当前从 XML 文件中读取的数据库模式(关系等)。所以我正在构建一个 UI 来轻松创建所述 XML 文件。如果我使用数据库中的实际数据,视图模型肯定看起来完全不同。
【问题讨论】:
-
请原谅我的吹毛求疵,但我无法抗拒命名约定中有很多冗余的想法。
ViewModel是视图的模型。那么ViewViewModel是什么?视图的视图模型?这里太多了。 :) 也许这就是让你头脑混乱并阻碍对 MVVM 理解的原因? -
:) 是的,我同意,这有点愚蠢。这个想法是,假设我有一个
DatabaseView和一个相应的视图模型。所以我称之为DatabaseView(_)ViewModel -
我明白了,但我认为你会同意拥有:
Database(模型)、Database(_)View和Database(_)ViewModel,因为它至少反映了对象的角色。 -
绝对!事实上,当我想到它时,称它为
...ViewViewModel可能意味着视图和视图模型之间的耦合,避免这种耦合是 mvvm 的重点...... :)
标签: c# wpf mvvm inversion-of-control prism