Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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# Prism单实例viewmodel,由多个视图使用_C#_Wpf_Mvvm_Module_Prism - Fatal编程技术网

C# Prism单实例viewmodel,由多个视图使用

C# Prism单实例viewmodel,由多个视图使用,c#,wpf,mvvm,module,prism,C#,Wpf,Mvvm,Module,Prism,我有一个相对复杂的模块化应用程序,它似乎非常适合Prism库和Shell/Module体系结构 我被以下可能性所困扰: 我的应用程序将连接到许多物理设备,例如,我想通过RS232连接到一个激光器。我只需要激光器执行一些方法,如连接、获取高度、发送命令和断开连接。所以所有这些都应该在激光类中定义 现在,我需要一个LaserModule,它将有多个视图分布在整个应用程序中。一个视图可能使用GetHeight不断轮询激光器并显示值,另一个视图可能是一个简单的按钮,执行单个GetHeight并在对话框中

我有一个相对复杂的模块化应用程序,它似乎非常适合Prism库和Shell/Module体系结构

我被以下可能性所困扰:

我的应用程序将连接到许多物理设备,例如,我想通过RS232连接到一个激光器。我只需要激光器执行一些方法,如连接、获取高度、发送命令和断开连接。所以所有这些都应该在激光类中定义

现在,我需要一个LaserModule,它将有多个视图分布在整个应用程序中。一个视图可能使用GetHeight不断轮询激光器并显示值,另一个视图可能是一个简单的按钮,执行单个GetHeight并在对话框中显示结果。另一个视图可能只是添加到listview区域(在其他模块视图中)的另一个按钮,单击该区域会转到LaserModule的设置视图

也就是说,每个LaserModule只能有一个laser类实例,因为我只能连接到RS232端口一次。此外,我认为所有视图都将共享同一个(单实例)视图模型,因为许多功能在不同的视图中共享

这有什么意义吗?我将有许多区域,但当我在这些区域中来回交换视图时,我永远不想创建每个视图/视图模型的多个实例

最后,应用程序应该能够为每个物理连接的激光器处理多个激光模块(但每个模块都有各自单独的一组单实例视图/视图模型)


非常感谢您的任何见解,这张图片大致概括了我正在尝试做的事情:

您将拥有一个激光服务,该服务将作为单例在容器中注册。然后您的ViewModel将使用该服务。不要尝试使用单一视图模型。这是自找麻烦。

谢谢Brian,在我的LaserModule初始化内部注册laser类在哪里有意义?如果在我的应用程序中需要2/3/4+激光器,那么在初始化期间在foreach循环中简单地注册激光器类是否是最佳实践?或者添加第二/第三/第四/第四个激光器模块,并且每个模块都有自己的单重态激光器,这有意义吗?或者这个决定完全是微不足道的,因为两者都是可能的?嗨,布莱恩。我想注册单例子视图模型,以便将它们作为参数传递给其父视图模型。这样,父视图模型可以调用子viewmodel的命令。你能更详细地解释一下这种方法的缺点吗?还有,如何在不同视图中重用viewmodel命令?