【问题标题】:MvvmCross passing data from One viewmodel to another viewmodelMvvmCross 将数据从一个视图模型传递到另一个视图模型
【发布时间】:2015-09-18 05:09:10
【问题描述】:

我正在开发 Xamarin Android 应用程序。我正在为 ViewModels 使用 MvvmCross 模式。

现在,我想将数据从一个 ViewModel 传递到另一个视图模型,但不想导航到该 ViewModel。我不想导航到那个ViewModel,而是想导航到另一个ViewModel。

例如:我有三个ViewModels V1、V2 和 V3。现在我想将数据从 V1 传递到 V2,但想导航到 V3。

这可能吗?

【问题讨论】:

    标签: xamarin viewmodel mvvmcross


    【解决方案1】:

    查看 MvvmCross Messenger 以执行此操作:https://github.com/MvvmCross/MvvmCross-Plugins/tree/master/Messenger

    你需要在你的视图模型上订阅一些东西:

    public class LocationViewModel 
    : MvxViewModel
    {
    private readonly MvxSubscriptionToken _token;
    
    public LocationViewModel(IMvxMessenger messenger)
    {
        _token = messenger.Subscribe<LocationMessage>(OnLocationMessage);
    }
    
    private void OnLocationMessage(LocationMessage locationMessage)
    {
        Lat = locationMessage.Lat;
        Lng = locationMessage.Lng;
    }
    
    // remainder of ViewModel
    }
    

    【讨论】:

      【解决方案2】:

      我建议将您需要共享的数据保存在“服务”中,作为由 MvvmCross 管理的单例类的服务:

      CreatableTypes()
          .EndingWith("Service")
          .AsInterfaces()
          .RegisterAsLazySingleton();
      

      在您的视图模型中,您只需将其添加到构造函数即可使用该单例:

      public WhateverViewModel(IService service)
      

      该服务将是单例的,因此您的数据将在应用程序生命周期中持续存在。

      因此,在您的一个视图模型中,您可以这样做:

      service.SharedData = new SharedData();
      

      在另一个视图模型中:

      this.data = service.SharedData
      

      【讨论】:

        【解决方案3】:

        最简单的方法是使用来自 MvvmCross 的 Messenger Plugin。您可以在 V2 中订阅某种消息并在 V1 中发布该消息,然后在单独的步骤中导航到 V3。

        // subscribing to a certain message type
        this.logoutToken = this.messenger.Subscribe<LogoutMessage>(this.HandleLogoutMessage);
        
        // Creating and sending a message
        var logoutMessage = new LogoutMessage(this, "You have been logged out.");
        this.messenger.Publish(logoutMessage);
        

        注意:将MessageToken 分配给成员变量很重要(就像在另一个答案中一样),否则它会被垃圾收集器清理掉。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-03-02
          • 2018-01-18
          • 2014-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多