2

在我从另一个视图模型收集数据的主视图模型中,我创建了两个或三个具有不同签名的公共 Init 方法。当我使用 ShowViewModel 从其他视图模型导航回基本视图模型时,我等待正确的 Init 方法将被执行,但这不会发生。关于此处的问候实用文档:

http://slodge.blogspot.ch/2013/03/v3-new-viewmodel-lifecycle.html

这应该可行:-/。

我将用一些代码来解释这一点。

我的主要视图模型是例如:

public class MainViewModel : MvxViewModel
{
     MainViewModel() {}

     public class ParameterFirst
     {
         public string Id { get; set; }
     }

     public class ParameterSecond
     {
         public string Id { get; set; }
     }

     public class ParameterSecond
     {
         public string Id { get; set; }
     }

     public class ParameterThird
     {
         public string Id { get; set; }
     }

     public void Init(ParameterFirst objFirst)
     {
          //do something
     }

     public void Init(ParameterSecond objSecond)
     {
          //do something
     }

     public void Init(ParameterThird objThird)
     {
          //do something
     }
}

然后我将从另一个视图模型导航并等待正确的 Init 方法将被执行:

public class CollectData_ONE_ViewModel : MvxViewModel
{
     CollectData_ONE_ViewModel() {}

     public void DidWork()
     {
          //Hopefully the Init method with argument ParameterFirst should be called
          base.ShowViewModel<MainViewModel>(new MainViewModel.ParameterFirst { Id = "11" });
     }
}

接下来是第二个视图模型

public class CollectData_SECOND_ViewModel : MvxViewModel
{
     CollectData_SECOND_ViewModel() {}

     public void DidWork()
     {
          //Hopefully the Init method with argument ParameterFirst should be called
          base.ShowViewModel<MainViewModel>(new MainViewModel.ParameterSecond { Id = "22" });
     }
}

和第三个视图模型

public class CollectData_THIRD_ViewModel : MvxViewModel
{
     CollectData_THIRD_ViewModel() {}

     public void DidWork()
     {
          //Hopefully the Init method with argument ParameterFirst should be called
          base.ShowViewModel<MainViewModel>(new MainViewModel.ParameterThird { Id = "33" });
     }
}

在我的代码中,每次调用 First Init 方法时,我真的到了最后,没有更多的想法:) 这里有人遇到过同样的问题吗?或者这里有没有人有另一个想法以优雅的方式将数据收集到主视图模型?非常感谢您的阅读:)

4

1 回答 1

2

MvvmCross 中的Init机制是故意轻量级的。如果你声明了多个方法,它们都会被调用——这是设计使然。此外,如果某些Init参数对象要共享属性,那么这些会发生冲突 - 请参阅v3 中导航参数中的自定义类型

正如它在博客文章中所说,您引用“通常您可能只想在您的应用程序中使用一个” - 所以我建议重构为单个导航参数对象并使用您自己的基于 ViewModel 的逻辑来决定您的 ViewModel 应该如何初始化。

如果您确实需要Init在三种不同情况下调用三种方法,那么您可以使用自定义方法(可能在 BaseViewModel 类中)轻松打包和解包您自己的参数对象,例如https://stackoverflow.com/a/19059938/373321

于 2013-10-14T07:21:15.640 回答