MvvmCross 将数据从一个视图模型传递到另一个视图模型

MvvmCross passing data from One viewmodel to another viewmodel

我正在研究 Xamarin Android Application.I 我正在为 ViewModels 使用 MvvmCross 模式。

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

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

这可能吗?

查看 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
}

最简单的方法是使用 MvvmCross.You 中的 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 分配给成员变量很重要(就像在其他答案中一样),否则它会被垃圾清理收藏家。

上述 Messenger 插件的替代方案我建议将您需要共享的数据保存在 "service" 中,作为由 MvvmCross 管理的单例 class 服务:

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

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

public WhateverViewModel(IService service)

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

因此,在您的视图模型之一中,您可以执行以下操作:

service.SharedData = new SharedData();

在另一个视图模型中:

this.data = service.SharedData