Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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# 如何从ViewModel实例化视图?_C#_User Interface_Mvvm - Fatal编程技术网

C# 如何从ViewModel实例化视图?

C# 如何从ViewModel实例化视图?,c#,user-interface,mvvm,C#,User Interface,Mvvm,事件发生在我们的模型和ViewModel中,需要创建适当的视图。问题是如何做到这一点,避免在VM或M中出现任何视图代码 以下是事件的顺序,您可以看到这一困境: 用户在表单中设置数字字段以启动长时间运行的后台进程,然后单击“开始”按钮。如果这个长时间运行的过程成功了,那么它需要弹出一个带有图表的图表来显示结果。但是,如果数据因任何原因处理失败,则它无法弹出图表,而是记录一条错误消息,该消息显示在表单的a文本框中 现在,start按钮调用ViewModel中的一个方法,该方法实际上启动后台线程 只有

事件发生在我们的模型和ViewModel中,需要创建适当的视图。问题是如何做到这一点,避免在VM或M中出现任何视图代码

以下是事件的顺序,您可以看到这一困境:

用户在表单中设置数字字段以启动长时间运行的后台进程,然后单击“开始”按钮。如果这个长时间运行的过程成功了,那么它需要弹出一个带有图表的图表来显示结果。但是,如果数据因任何原因处理失败,则它无法弹出图表,而是记录一条错误消息,该消息显示在表单的a文本框中

现在,start按钮调用ViewModel中的一个方法,该方法实际上启动后台线程

只有背景可以确定何时或是否创建视图

目前,我们通过使用一个名为ChartInterface的接口来实现这一点。视图实现这个接口,然后设置一个回调委托,一直到后端模型。当它决定创建图表时,它调用回调并使用接口传递适当的数据等

然而,这带来了一个问题,因为它可能产生几十个或数百个图表。因此,我们需要有一个“仪表板”,其中包含所有图表的列表,供用户选择要查看的图表

因此,现在后端需要决定何时或是否创建仪表板视图,然后向其添加图表视图

所以它变得越来越混乱,因为这种情况会越来越多,因为我们有很多需要视图的模型,所以创建大量回调委托的速度很快就会变得很糟糕

一个似乎可以简化而不是大量回调的想法是只将一个接口传递给后端的ViewBinder。然后,每次创建模型对象时,它都可以将其传递给ViewBinder,以查看是否要将任何视图对象绑定到它

我们的想法是,大多数后端对象(最终)都将以图形方式进行监控。因此,如果在构建之后,它们中的每一个都被传递到ViewBinder界面,那么视图可以决定是否要将任何内容绑定到它


这听起来总是很好。

在编写代码时,答案变得很清楚

公共接口ModelBinderInterface{ void-TryBind(对象模型); }

每个视图对象实现这个接口比使用一个全局“服务器定位器”更自然

然后,当它创建任何ViewModel对象时,它会将自己指定给ViewModel对象的ModelBinder属性

现在ViewModel可以将这个相同的接口传递给后端进程

当任何相关模型被实例化时,它都会使用对象调用ModelBinder

然后视图对象可以决定是否可以实例化该对象,如果不能,则可以将调用传递给其父对象,该父对象也实现了ModelBinderInterface

通过这种方式,每个视图都可以处理实例化视图,以了解是将控件添加到DataGridView还是将对象绑定到ListView,等等


当然,这仍然允许使用singleton ModelBinder,因为较低级别可以继续将调用交给顶级应用程序ModelBinder,而顶级应用程序ModelBinder只有一个,并且它可以提供singleton实例。

我的方法是后台进程应该创建结果的ViewModel,而不是视图。@hyp。对不起,不清楚。它确实创建了一个模型和一个视图模型。但是,接下来如何创建视图并将其绑定?问题是视图层中没有任何东西知道何时需要这样做。只有backe nd知道何时该创建视图并将其绑定到ViewModel。对,因此,如果您有一个具有结果的ViewModel,则应将相应的视图创建为任何其他视图。不确定如何使用其他ViewModels,但我始终采用基于服务的路径。换句话说,您已经得到了一个服务,您向它抛出一个VM,它将加载相应的视图。MVVM框架将使您更轻松,我建议您使用“Catel”@。希望如此helps@hyp对我们从一个框架开始,我忘了名字。但是我们不能为ServiceLocator使用任何静态对象。我们需要依赖注入。不过,您确认了我的理论,我将创建一个界面,视图可以像ModelBinderInterface一样传递给ViewModel。