谁应该在MvvmCross中创建视图模型实例

谁应该在MvvmCross中创建视图模型实例,mvvm,viewmodel,mvvmcross,Mvvm,Viewmodel,Mvvmcross,我只想说清楚:我知道MvvmCross在创建视图模型的位置和方式方面非常灵活。我的问题更多的是关注点的适当分离,以简化复杂跨平台应用程序的设计 假设我们有一个包含客户列表和客户详细信息的应用程序。在iPad和Surface上,列表和详细信息显示在同一页上,但在较小的设备上,所选客户的客户列表和详细信息在不同的页面上分开显示。因此,我们有一个PCL,其中包含CustomerListViewModel和CustomerDetailsViewModel。现在,我们应该如何从可移植类库中管理视图模型生存

我只想说清楚:我知道MvvmCross在创建视图模型的位置和方式方面非常灵活。我的问题更多的是关注点的适当分离,以简化复杂跨平台应用程序的设计

假设我们有一个包含客户列表和客户详细信息的应用程序。在iPad和Surface上,列表和详细信息显示在同一页上,但在较小的设备上,所选客户的客户列表和详细信息在不同的页面上分开显示。因此,我们有一个PCL,其中包含CustomerListViewModel和CustomerDetailsViewModel。现在,我们应该如何从可移植类库中管理视图模型生存期

我最初是使用CustomerListViewModel实现中的代码完成的,代码如下所示:

public ICommand SelectCustomerCommand
{
    get { return new MvxCommand(SelectCustomer); }
}

public void SelectCustomer()
{
    if (formFactor == FormFactor.Phone)
    {
        ShowViewModel<CustomerDetailsViewModel>(new CustomerDetailsViewModel.NavObject(this.SelectedCustomer));
    }
    else
    {
        this.CustomerDetails = new CustomerDetailsViewModel(this.SelectedCustomer);
    }
}

但是,如果视图模型生存期由演示者控制,我们是否应该尝试将KillMe调用放在演示者的逻辑中?我知道这么小的一段代码没有多大区别,但这难道不是一个优势,可以将其放在presenter的类中并减少代码落后吗?

显然,ViewModel不应该处理与视图(屏幕)有关的任何事情

我有一个简单的想法,就是使用一个自定义的presenter,它能够根据ShowViewModel请求创建视图

自定义演示者负责查看,因此您可以测试屏幕方向


关于问题的第二部分:

但是,如果视图模型生存期由演示者控制,我们是否应该尝试将KillMe调用放在演示者的逻辑中?我知道这么小的一段代码并没有多大区别,但这难道不能成为将它放在presenter类中并减少代码落后的优势吗

当前视图模型演示文稿由演示者编排-它获取
ViewModelRequest
对象并决定如何处理它们

但是,它通常不会创建ViewModels,而是:

  • 演示者通常创建/显示视图
  • 然后,视图创建(或定位)一个视图模型,作为
    OnCreate
    ViewDidLoad
    OnNavigatedTo
    处理的一部分
因此,我不认为ViewModel的生命周期通常是“由演示者控制的”——相反,我认为ViewModel是“视图的模型”——因此它的生命周期是“由其视图控制的”

对于需要在ViewModel中关闭/处置/终止逻辑的情况,如果您想将该逻辑移回演示者内部-或移回其他对象中-如果您愿意,您当然可以这样做-这是您的应用程序,应用程序就是王

然而,在这些情况下,我怀疑您需要演示者从视图中获得某种通知——因为演示者通常不知道视图何时被删除(当模式被取消时,当按下后退按钮时,当Android清除堆栈视图以节省内存时,等等)


另一种思考方式是,如果演示者被重命名为
INavigationService
,那么您希望
INavigationService
在您的应用程序中拥有哪些角色?

谢谢。我将检查您引用的博客文章中的链接。我同意此选项-我更喜欢父虚拟机调用
ShowViewModel
(或其他服务),而不是直接在
if
语句中创建虚拟机。谢谢。您为我澄清了视图和演示者之间的责任划分。
public void SelectCustomer()
{
    ShowViewModel<CustomerDetailsViewModel>(new CustomerDetailsViewModel.NavObject(this.SelectedCustomer));
}
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedFrom(e);
    VisibleViewModel.IsVisible(false);
    if (e.NavigationMode == NavigationMode.Back)
        KillableViewModel.KillMe();
}