Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.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
在MVVM中,谁';s的职责是控制新视图(当前视图或其ViewModel)的创建吗?_View_Viewmodel_Mvvm - Fatal编程技术网

在MVVM中,谁';s的职责是控制新视图(当前视图或其ViewModel)的创建吗?

在MVVM中,谁';s的职责是控制新视图(当前视图或其ViewModel)的创建吗?,view,viewmodel,mvvm,View,Viewmodel,Mvvm,场景: -应用程序将加载ViewA及其关联的ViewModelA。 -ViewA有一个按钮,该按钮的命令绑定到ViewModelA上的命令。 -ViewModelA处理该命令,应创建并显示ViewB的实例。 问题是,谁应该负责创建ViewB实例? ViewModel不应该知道任何有关视图的信息,这似乎是合理的,因此我认为有两种可能可行: 1) ViewModelA可以设置由ViewA监视的属性,以便ViewA知道如何创建ViewB的实例。但这似乎给了ViewA太多的责任。 2) 您可以将

场景:
-应用程序将加载ViewA及其关联的ViewModelA。
-ViewA有一个按钮,该按钮的命令绑定到ViewModelA上的命令。
-ViewModelA处理该命令,应创建并显示ViewB的实例。

问题是,谁应该负责创建ViewB实例?

ViewModel不应该知道任何有关视图的信息,这似乎是合理的,因此我认为有两种可能可行:

1) ViewModelA可以设置由ViewA监视的属性,以便ViewA知道如何创建ViewB的实例。但这似乎给了ViewA太多的责任。

2) 您可以将某种类型的ViewManager服务注入ViewModelA,当它处理来自ViewA的命令时,它可以使用command参数将某种适当的元数据传递到ViewManager的LoadView(metadata)方法中

看看arconaut(即使这不是当时公认的答案,但似乎是最干净的方法:

  • 在ViewModel中,使用某种中介模式(或类似EventAggregator的模式)来“发布”CreateView消息
    • 在某个地方有一个类,叫做ViewManager,其职责是订阅所有CreateView消息,并实例化相应的视图
这几乎就像你的第二个建议,只是有点松散耦合。

看看arconaut(即使当时不是公认的答案,它似乎是最干净的方法:

  • 在ViewModel中,使用某种中介模式(或类似EventAggregator的模式)来“发布”CreateView消息
    • 在某个地方有一个类,叫做ViewManager,其职责是订阅所有CreateView消息,并实例化相应的视图

这几乎就像你的第二个建议,只是有点松散耦合。

这听起来确实像是我将使用的解决方案。我正在考虑将我的应用程序分为不同的方面或功能(即登录方面、用户管理方面、客户管理方面等)。应用程序的每个方面都有自己的AspectController对象,其任务是初始化和管理与应用程序的各个方面相关的视图/视图模型。它将侦听显示不同视图的请求,并确定是否/如何初始化和显示请求的视图。这意味着登录AspectController将初始化并显示LoginView/LoginView模型,当用户单击“重置密码”时按钮,该命令将由LoginViewModel处理,并请求ResetPasswordView/ResetPasswordViewModel。LoginSpectController将接收并适当处理该请求。我不确定“AspectController”是否是正确的名称,或者如果有更好的名称。这听起来确实像是我将使用的解决方案。我正在考虑将我的应用程序分为不同的方面或功能(即登录方面、用户管理方面、客户管理方面等)。应用程序的每个方面都有自己的AspectController对象,其任务是初始化和管理与应用程序的各个方面相关的视图/视图模型。它将侦听显示不同视图的请求,并确定是否/如何初始化和显示请求的视图。这意味着登录AspectController将初始化并显示LoginView/LoginView模型,当用户单击“重置密码”时按钮,该命令将由LoginViewModel处理,并请求ResetPasswordView/ResetPasswordViewModel。LoginSpectController将接收并适当地处理该请求。我不确定是否可以使用“AspectController”来调用它,或者是否有更好的名称。