mvvmcross - viewmodel中的多个Init方法,不同的签名不起作用

时间:2013-10-12 21:53:17

标签: mvvmcross

主视图模型中,我从另一个视图模型收集数据,我在摘要中创建了两个或三个具有不同签名的公共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
     }
}

然后我将从另一个viewmodel导航并等待执行正确的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" });
     }
}

接下来是第二个viewmodel

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方法时,我真的都在最后,没有进一步的想法:)这里有没有人遇到过同样的问题?或者这里有人有另一个想法以优雅的方式收集数据到主视图模型?非常感谢提前阅读:)

1 个答案:

答案 0 :(得分:2)

MvvmCross中的Init机制是故意轻量级的。如果声明多个方法,则会调用所有方法 - 这是设计的。此外,如果某些Init参数对象要共享属性,那么这些属性会发生冲突 - 请参阅Custom types in Navigation parameters in v3

正如你所引用的blog post所说的那样“通常你可能只想在你的应用程序中使用一个” - 所以我建议重构一个导航参数对象并使用你自己的基于ViewModel的逻辑决定ViewModel应该如何初始化。

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