0

我目前正试图围绕MVVM-Pattern. 此外,我正在使用PRISMIoC 支持等。但有一点(除其他外)特别是,我对自己的工作方式感到不舒服,因为这对我来说似乎有点奇怪,所以也许我没弄对。

假设我想做一个ListView显示数据库模式的一部分。因此,在“顶级”上,每个数据库都有一个元素。在这些元素中,我想显示该数据库中的表以及该表的列名。

我现在这样做的方式是创建 3 个视图模型(+1 Base-ViewModel 用于托管ListView. 的每个“层”一个ListView。所以我有 fe a DatabaseViewViewModel, aDatabaseTableViewViewModel和 a DatabaseTableColumnViewViewModel(这里的名字不太热)。

所以 Base-ViewModel 有一个ObservableCollectionof DatabaseViewViewModels,DatabaseViewViewModel有一个ObservableCollectionof DatabaseTableViewViewModels 等等。

所以显然这些视图模型需要一些配置数据(DatabaseTableViewViewModelfe 需要知道它的数据库)。在我看来,一个对象应该在创建后完全初始化,所以我想在构造函数中传递该数据。当然,这使得从 IoC 容器中解析这些视图模型成为不可能。但是我“必须”解决它,因为它们有一些需要解决的依赖项(fe an IEventAggregator)。

据我所知,处理这个问题的(或至少一种)方法是用来Factories创建视图模型,但我对这种布局不太满意。它似乎有点“过大”。

所以我想问你,我是否可能忽略了一些事情。我的视图模型设计是否有效?或者您将如何为这种“分层”设计您的视图模型ListView

编辑:为了清楚起见:我创建这 3 个不同的视图模型的原因是,我认为它有点混乱(事实上,我很难想出一个如何实现它的想法。我的头脑)当您尝试在层次结构(fe 列名)的更下方公开对象的属性以进行数据绑定时。

当然,我可以使用依赖属性或INotifyPropertyChanged在我的模型类中实现 ——这实际上可能是一个新项目的好方法——但让我们假设你有一个模型,它不能轻易修改。

Edit2:关于 Sheridan 对奇怪的视图模型类的评论,那是因为在我正在开发的应用程序中,数据库模式是我的数据。我没有处理数据库中的实际数据。(我正在为 Microsoft 的 Forefront Identy Manager 开发一个 MySQL 管理代理。该管理代理需要知道当前从 XML 文件中读取的数据库模式(关系等)。所以我正在构建一个 UI 来轻松创建所述 XML 文件。如果我使用数据库中的实际数据,视图模型肯定看起来完全不同。

4

3 回答 3

1

根据经验,对于那些在编译时已知的依赖项,我使用 IoC 容器来配置它们并将它们注入到相关的类中。对于那些需要运行时信息的依赖项(例如数据库的选择),我注入了一个静态配置的工厂,使我能够在运行时创建这些对象。

为此,我不认为工厂的使用是“过大的”。

重要的是以正确的方式为您的视图模型建模,您似乎正在这样做。数据库包含表 - 因此您的视图模型应该(并且确实)反映了这一点。我认为你走在正确的道路上!

于 2013-08-29T08:56:30.043 回答
1

我认为您可能在这里稍微走错了路……在我看来,直接在您的数据对象中实现接口要容易INotifyPropertyChanged得多,而不是为每个对象设置一个单独的视图模型。您的 .NET 类不一定与您的数据库架构相匹配……想想面向对象的编程:

你的数据库可能有Company,PersonAddress表,但是在 .NET 中,你的Company类可能包含一个类型的集合属性,Person每个Person类都可能有一个类型的属性Address......所以现在我们正在构建分层数据类......非常适合显示在 UI 的分层控件中。

现在将这个示例继续到视图模型级别,您只需要提供Company数据类型的集合以绑定到ItemsSource控件属性,并且可能需要提供单个Company属性来绑定到SelectedItem控件属性。

在阅读您的问题时,给我敲响了警钟的一件事是关于您的DatabaseViewModel……基本上不,不,不。我们永远不会看到具有此名称的视图模型(至少在大型应用程序中)。数据来自模型而不是视图模型......我们不将我们的视图模型与我们的数据库表匹配......只需为此使用基本数据类型类。

可以这样想……我的数据类型类包含每个数据库表列的所有属性,但以更 3D 或分层的方式连接。我通常为每个表有一个 .NET 类,但弱实体或连接表通常在 .NET 中实现为一个类,其中一个类具有另一个类的类型的属性。

模型(数据库访问)类从对数据库的调用中填充这些数据类型类,并将它们传递给视图模型类。我的视图模型类只是每个特定视图中所需的所有属性的集合,其中大多数都将数据类型类作为它们的类型。我的视图模型也有提供视图功能的方法。

我个人觉得使用 MVVM 与 WPF 齐头并进,没有它就不会梦想使用 WPF(最小的应用程序除外)。我觉得您可能会从更多有关 MVVM 的阅读中受益,尽管您在这里收到的答案可能就足够了。

于 2013-08-29T09:14:57.950 回答
0

首先,我认为您不需要三个视图模型。这些应该是“模型”。DataBaseModel 将是包含 TableModel 列表的父模型,而 TableModel 又包含 ColumnModel 列表。

然后,您只需要一个 ViewModel,它将具有 DataBaseModel 列表,并且此 viewmodel 将用作您的视图的 Datacontext。视图模型将具有默认构造函数,因此可以解析。为了初始化 DatabaseModel,使用配置提供连接字符串来初始化它。

对于层次结构,使用带有 HierarchicalDataTemplates 的 TreeView 来显示层次结构。

于 2013-08-29T08:51:31.563 回答