Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVVM视图模型设计_C#_Wpf_Mvvm_Inversion Of Control_Prism - Fatal编程技术网

C# MVVM视图模型设计

C# MVVM视图模型设计,c#,wpf,mvvm,inversion-of-control,prism,C#,Wpf,Mvvm,Inversion Of Control,Prism,我目前正试图围绕MVVM模式总结我的未来。此外,我还使用了PRISM来支持国际奥委会等。但有一件事(尤其是)我对自己的做法感到不舒服,因为我觉得这有点奇怪,所以可能是我做得不对 假设我想制作一个ListView,它显示数据库模式的一部分。所以在“顶层”中,每个数据库有一个元素。在这些元素中,我希望显示该数据库中的表以及该数据库中该表的列名 我现在这样做的方式是创建3个视图模型(+1个基本视图模型用于承载列表视图的视图)。列表视图的每个“层”一个。因此,我需要一个f.e.databaseviewm

我目前正试图围绕
MVVM模式
总结我的未来。此外,我还使用了
PRISM
来支持国际奥委会等。但有一件事(尤其是)我对自己的做法感到不舒服,因为我觉得这有点奇怪,所以可能是我做得不对

假设我想制作一个
ListView
,它显示数据库模式的一部分。所以在“顶层”中,每个数据库有一个元素。在这些元素中,我希望显示该数据库中的表以及该数据库中该表的列名

我现在这样做的方式是创建3个视图模型(+1个基本视图模型用于承载
列表视图的视图)。
列表视图的每个“层”一个。因此,我需要一个f.e.
databaseviewmodel
、一个
databasetableviewmodel
和一个
databasetablecolumnviewmodel
(这里的名称不太热门)

因此,基本视图模型有一个
databaseviewmodel
s的
ObservableCollection
,而
databaseviewmodel
有一个
databasetableviewmodel
ObservableCollection
等等

因此,很明显,这些视图模型需要一些配置数据(DatabaseTableViewModel
f.e.需要知道它的数据库)。在我看来,一个对象应该在创建后完全初始化,所以我想在构造函数中传递该数据。当然,这使得无法从IoC容器解析这些视图模型。但我“必须”解决它,因为它们有一些依赖关系需要解决(例如,
IEventAggregator

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

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

编辑:用于清晰化:我之所以创建这3种不同的视图模型,是因为当您试图在层次结构(例如列名)的更深处公开对象的属性时,我觉得它有点混乱(事实上,我很难想出一个如何实现它的想法)用于数据绑定

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


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

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

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


对于层次结构,使用TreeView和HierarchycalDataTemplates来显示层次结构。

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

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

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

我认为您可能在这里走错了一点……在我看来,直接在数据对象中实现
INotifyPropertyChanged
接口要容易得多,而不是为每个对象都有一个单独的视图模型。您的.NET类不一定会检查您的数据库模式…考虑面向对象编程:

您的数据库可能有
Company
Person
Address
表,但在.NET中,您的
Company
类可能包含类型为
Person
的集合属性,而每个
Person
类可能有类型为
Address
的属性……因此,现在我们正在构建分层数据类…非常适合在UI的分层控件中显示

现在将这个示例继续到视图模型级别,您只需要提供一个
公司
数据类型的集合,以绑定到
项目资源
控件属性,还可以提供一个
公司
属性,以绑定到
SelectedItem
控件属性

在阅读您的问题时,有一件事给我敲响了警钟,那就是关于您的
DatabaseViewModel
…基本上不,不,不。我们不应该看到具有此名称的视图模型(至少在大型应用程序中)。数据来自模型,而不是视图模型…以及