【问题标题】:mvvmcross - multiple Init methods in viewmodel with different signature not workingmvvmcross - 具有不同签名的视图模型中的多个 Init 方法不起作用
【发布时间】:2013-10-20 19:12:48
【问题描述】:

在我从另一个视图模型收集数据的主视图模型中,我创建了两个或三个具有不同签名的公共初始化方法。当我使用 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 方法时,我真的走到了尽头,没有进一步的想法:) 这里有人遇到过同样的问题吗?或者这里有没有人有另一个想法以优雅的方式将数据收集到主视图模型?非常感谢您的阅读:)

【问题讨论】:

  • 好了,现在我做了一个新的体验,三个Init方法都会被依次调用,带有合适签名的Init方法得到传递的对象。因此,在任何 Init 方法中都绝对需要对 null 进行参数检查。尽管如此,非常感谢他们阅读并考虑了解决方案。
  • 请回答您自己的问题并将其标记为已解决。
  • 问题已得到解答,但由于调用了所有 Init 方法并且签名中的对象可能具有相同的属性,因此存在另一个问题,很难将入口点分开。

标签: mvvmcross


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多