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
…基本上不,不,不。我们不应该看到具有此名称的视图模型(至少在大型应用程序中)。数据来自模型,而不是视图模型…以及