在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消息,并实例化相应的视图
- 在ViewModel中,使用某种中介模式(或类似EventAggregator的模式)来“发布”CreateView消息
- 在某个地方有一个类,叫做ViewManager,其职责是订阅所有CreateView消息,并实例化相应的视图
这几乎就像你的第二个建议,只是有点松散耦合。这听起来确实像是我将使用的解决方案。我正在考虑将我的应用程序分为不同的方面或功能(即登录方面、用户管理方面、客户管理方面等)。应用程序的每个方面都有自己的AspectController对象,其任务是初始化和管理与应用程序的各个方面相关的视图/视图模型。它将侦听显示不同视图的请求,并确定是否/如何初始化和显示请求的视图。这意味着登录AspectController将初始化并显示LoginView/LoginView模型,当用户单击“重置密码”时按钮,该命令将由LoginViewModel处理,并请求ResetPasswordView/ResetPasswordViewModel。LoginSpectController将接收并适当处理该请求。我不确定“AspectController”是否是正确的名称,或者如果有更好的名称。这听起来确实像是我将使用的解决方案。我正在考虑将我的应用程序分为不同的方面或功能(即登录方面、用户管理方面、客户管理方面等)。应用程序的每个方面都有自己的AspectController对象,其任务是初始化和管理与应用程序的各个方面相关的视图/视图模型。它将侦听显示不同视图的请求,并确定是否/如何初始化和显示请求的视图。这意味着登录AspectController将初始化并显示LoginView/LoginView模型,当用户单击“重置密码”时按钮,该命令将由LoginViewModel处理,并请求ResetPasswordView/ResetPasswordViewModel。LoginSpectController将接收并适当地处理该请求。我不确定是否可以使用“AspectController”来调用它,或者是否有更好的名称。