mvvm - 谁应该在 MvvmCross 中创建 View 模型实例

标签 mvvm viewmodel mvvmcross

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

假设我们有一个包含客户列表和客户详细信息的应用。在 iPad 和 Surface 上,列表和详细信息显示在同一页面上,但在较小的设备上,选定客户的客户列表和详细信息会拆分在不同的页面上。所以我们有一个带有 CustomerListViewModel 和 CustomerDetailsViewModel 的 PCL。现在我们应该如何从可移植类库中管理 View 模型生命周期?

我最初是使用 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);
    }
}

这里最重要的是我们要么调用 ShowViewModel 依次要求演示者构建 CustomerDetailsViewModel 对象并将其呈现在新页面中,要么显式创建 CustomerDetailsViewModel 实例并将其绑定(bind)到 CustomerDetails。

在看过 N+1 MvvmCross 视频系列的第 32 和 42 集之后,我不确定这是不是正确的方法。当然可以,但是 View 模型应该关心其他 View 模型的实例化细节吗?

我的第二个想法是重构此代码并将此逻辑放入演示器中,这样我就可以简单地在 CustomerListViewModel 实现中编写:

public void SelectCustomer()
{
    ShowViewModel<CustomerDetailsViewModel>(new CustomerDetailsViewModel.NavObject(this.SelectedCustomer));
}

... 演示者将在 ShowViewModel 调用触发的代码中完成剩下的工作。然而,在第 42 集中展示了如何直接从关联 View 控制 View 模型的生命周期:

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedFrom(e);
    VisibleViewModel.IsVisible(false);
    if (e.NavigationMode == NavigationMode.Back)
        KillableViewModel.KillMe();
}

但是,如果 View 模型的生命周期由演示者控制,我们是否应该尝试将 KillMe 调用置于演示者的逻辑中?我知道这么小的一段代码并没有太大的区别,但是将它放在演示者的类中并减少代码隐藏难道不是一个优势吗?

最佳答案

ViewModel 绝对不应该处理与 View (屏幕)相关的任何事情。

我的一个快速想法是使用自定义演示器,它能够根据 ShowViewModel<> 请求创建 View 。

自定义演示者是一种 View 责任,因此您可以测试屏幕方向。

http://slodge.blogspot.co.uk/2013/06/presenter-roundup.html

关于mvvm - 谁应该在 MvvmCross 中创建 View 模型实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19953747/

相关文章:

xamarin - 如何使用 MvvmCross 创建 MasterDetailPage?

ios - 用于显示 UIView 的全局钩子(Hook)

c# - 带有MVVM的WPF建议文本框

c# - 如何将 EventArgs 传递给 DelegateCommand?

MVVM:负责加载相关数据,在哪一层?

c# - 便携类 4.0 : Missing Features

silverlight - MVVM : how to pass parameter to ViewModel's constructor

c# - 在Xamarin.Forms中,如何将同一 View 模型的更改通知回上一页? (可以传递到第二页,但不能返回)

c# - 验证不适用于 ViewModel

xaml - 从 View 的代码隐藏在MvvmCross中