Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# WPF:如何在MVVM中组织视图模型?_C#_.net_Wpf_Xaml_Mvvm - Fatal编程技术网

C# WPF:如何在MVVM中组织视图模型?

C# WPF:如何在MVVM中组织视图模型?,c#,.net,wpf,xaml,mvvm,C#,.net,Wpf,Xaml,Mvvm,我正在构建一个大规模的WPF应用程序,我想知道这是否是使用MVVM模式组织程序的正确方法 该项目在一棵树上保存着一个关于各自地区人口总体信息的数据库。此树和/或人员列表将在所有viewmodels中共享,以在各种图表中显示人口统计信息。这些不同的图表以不同的选项卡显示在视图中 目前,我有一个静态树来包含人的信息,每个xaml页面将对应于主窗口中的一个选项卡。每个选项卡都绑定到自己的viewmodel,但该viewmodel继承了mainviewmodel,因此可以在所有viewmodel之间共享

我正在构建一个大规模的WPF应用程序,我想知道这是否是使用MVVM模式组织程序的正确方法

该项目在一棵树上保存着一个关于各自地区人口总体信息的数据库。此树和/或人员列表将在所有viewmodels中共享,以在各种图表中显示人口统计信息。这些不同的图表以不同的选项卡显示在视图中

目前,我有一个静态树来包含人的信息,每个xaml页面将对应于主窗口中的一个选项卡。每个选项卡都绑定到自己的viewmodel,但该viewmodel继承了mainviewmodel,因此可以在所有viewmodel之间共享mainviewmodel中的信息

例:

MainViewModel.cs-(包含树、列表和其他变量)
Tab1ViewModel.cs-(继承MainViewModel)
Tab2ViewModel.cs-(继承MainViewModel,也可能继承Tab1ViewModel)
表3…等
MainWindow.xaml-Datacontext=MainViewModel
Tab1View.xaml-Datacontext=Tab1ViewModel
Tab2View.xaml-Datacontext=Tab2ViewModel
表3…等

这是设置MVVM模式的正确方法吗?我不知道有什么更好或更简单的方法可以在不同的视图之间共享静态数据。

唯一让我吃惊的是,您的选项卡继承了MainViewModel——这真的没有什么意义,因为这使它们成为一个单独的副本


听起来选项卡视图模型应该包含对(单例或类似)主视图模型的引用,或者可能只是一个显示所需字段(如SelectedPerson或类似内容)的接口,从类继承不会导致共享变量。每当Tab1ViewModel的实例出现时,MainViewModel中所有变量的新实例也会被创建,因此数据不会共享给Tab2ViewModel(而Tab2ViewModel又有自己的副本)

此外,我更喜欢视图和viewmodel之间的一对一-这意味着Tab1ViewModel不应该与MainViewModel逻辑相关。要在视图模型之间共享公共行为(属性更改事件、基本验证等),可以创建抽象的ViewModelBase。此外,视图模型通常不应该相互“了解”。相反,信息应该通过集中的消息在它们之间流动


如何共享数据的问题实际上与MVVM无关。最简单的方法是集中加载数据,并将其传递到每个视图模型的构造函数中,但更优雅的解决方案是使用依赖项注入。学习需要一些时间,但我强烈推荐。

视图模型应遵循视图。所以不管需要什么。剩下的是意见。谢谢。我只是担心它最终会像我的上一个项目一样,有另一个“上帝对象”,或者在本例中是一个“上帝视图模型”,我想避免这种情况。它与常规的OO建模和设计视图没有什么不同。超人类应该避免。@ermodeweard,你能澄清一下你关于OO建模的意思吗?这是一件好事吗?我可能会认为主视图模型提供的数据是一个独立的资源。我会将其移动到服务类,然后将其传递给构建时的每个viewmodel。它可以是同一个实例,这样就不会占用太多内存。我认为这通常被称为服务定位器模式。我还将对其进行接口并实现IoC,使其随着应用程序的增长而变得灵活。
MainViewModel.cs - (Contains the tree, list<people>, and other variables)
Tab1ViewModel.cs - (Inherits MainViewModel)
Tab2ViewModel.cs - (Inherits MainViewModel and maybe Tab1ViewModel)
Tab3...etc

MainWindow.xaml - Datacontext = MainViewModel
Tab1View.xaml - Datacontext = Tab1ViewModel
Tab2View.xaml - Datacontext = Tab2ViewModel
Tab3...etc