Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.ios MVVMCross从嵌套视图控制器中更改选定的选项卡栏项_Xamarin.ios_Mvvmcross - Fatal编程技术网

Xamarin.ios MVVMCross从嵌套视图控制器中更改选定的选项卡栏项

Xamarin.ios MVVMCross从嵌套视图控制器中更改选定的选项卡栏项,xamarin.ios,mvvmcross,Xamarin.ios,Mvvmcross,我们在应用程序中使用MVVMCross,我遇到了一些问题,我不确定我是否以最佳方式解决了这些问题 我们的一个视图模型包含3个其他视图模型-一个仪表板和2个列表。在iOS中,这是使用MvxTabBarViewController呈现的,它非常有效。Android和WP以类似的方式呈现了这个视图。对象模型的示例如下所示: public class ProjectViewModel : MvxViewModel { public DashboardViewModel Dashboard {ge

我们在应用程序中使用MVVMCross,我遇到了一些问题,我不确定我是否以最佳方式解决了这些问题

我们的一个视图模型包含3个其他视图模型-一个仪表板和2个列表。在iOS中,这是使用MvxTabBarViewController呈现的,它非常有效。Android和WP以类似的方式呈现了这个视图。对象模型的示例如下所示:

public class ProjectViewModel : MvxViewModel
{
    public DashboardViewModel Dashboard {get;set;}
    public FirstListViewModel FirstList {get;set;}
    public SecondListViewModel SecondList {get;set;}
}
我们现在的情况是,如果在DashboardViewModel中发生某个操作,我们希望指示导航更改iOS中的选项卡,并在其他平台上发生同样的事情

我能够在iOS上更改选项卡的唯一方法就是使用它;从iOS项目视图中

目前,我触发此更改的唯一方法是从仪表板ViewModel触发一个事件,然后ProjectViewModel订阅此事件,并触发ProjectView订阅的另一个事件,以指示它以任何设备特定的方式更改选项卡。我忍不住想有更好的办法

我试过查看iOS的自定义ViewPresenter,并在仪表板ViewModel中调用ShowViewModel FirstListViewModel,但该presenter似乎未被使用,因此我们只是正常过渡。我的想法是,我可以进入中间,取消导航请求,然后在投影视图上翻转活动选项卡。
如果有可能,我们可以通过MVVMCross以更好的跨平台方式处理更改,如果您有任何建议,我们将不胜感激。

您应该能够通过以下几种方式之一实现这一点:

  • 按照您的建议,将自定义演示者与覆盖的
    显示一起使用
  • 使用带有覆盖的ChangePresentation的自定义演示者-并使用自定义提示
  • 使用自定义绑定或ProjectView中属性的绑定来驱动转换
  • 使用自定义
    IMvxInteraction
    属性
  • 使用来自VM的自定义事件来查看
  • 使用messenger将消息从ViewModels发送到视图
最终,很多应用程序都可以工作,我会选择哪一个取决于哪一个可以工作,哪一个团队满意——发布工作应用程序始终是最终目标


考虑到我在MvvmCross方面的经验,我今天可能会选择尝试一种定制
IMvxInteraction
属性的方法。但这可能不适合所有人。。。对于这个样本来说,这肯定是“杀伤力过大”

但是,要做到这一点,我会尝试:

  • 公共枚举显示{Dash,First,Second}
    添加到核心项目中
  • 添加
    ProjectViewModel
    属性:

    private MvxInteraction<Display> _display = new MvxInteraction< Display >();
    public IMvxInteraction<Display> DisplayChange { get { return _display; } }
    
  • 绑定将添加到ViewDidLoad中,如下所示:

    set.Bind(this).For(v => v.ChangeDisplay).To(vm => vm.DisplayChange);
    

非常感谢Stuart如此全面的回复和MVVMCross。伟大的框架!
set.Bind(this).For(v => v.ChangeDisplay).To(vm => vm.DisplayChange);