在视图模型之间传递数据 MvvmCross

Passing Data Between Viewmodels MvvmCross

我正在开发 Xamarin Android 应用程序并且我正在使用 MvvmCross.I 无法在 Viewmodel 之间传递和检索数据。 解决方案是什么?

这取决于您要检索的数据。对于对象,请查看 Stuart 的 this answer

当你想要 send/retrieve 非对象数据时,你可以使用 build in viewmodel-navigation 来做到这一点,如下例所示:

// Navigate to viewmodel with parameters
var param = new Dictionary<string, string>
{
    {"key1", "value for key 1"
    {"key2", 12}
};

ShowViewModel<MyViewModel>(param);

然后在 MyViewModel:

中检索参数
protected override void InitFromBundle(IMvxBundle parameters)
{
    if (parameters.Data.ContainsKey("key1"))
    {
        var mykey1value = parameters.Data["key1"]
    }

    // And so on

    base.InitFromBundle(parameters);
}

有了 MvvmCross 5,您可以使用 IMvxNavigationService

例如,您有 FooViewModelBarViewModel

public class FooViewModel : MvxViewModel {}
public class BarViewModel : MvxViewModel<DataParameter> {}

并且您想将一些数据从 FooVM 传递到 BarVM。 如您所见,BarViewModel 继承自 MvxViewModel,其中 DataParameter 作为泛型类型。这个 class 描述了我们要扔给 BarViewModel 的数据。

public class DataParameter
{
    public string Name { get; set; }
}

现在您可以像这样在 FooViewModel 中使用 IMvxNavigationService

var parameter = new DataParameter
{
    Name = "Alex"
};

await Mvx
   .IoCProvider
   .Resolve<IMvxNavigationService>
   .Navigate<BarViewModel, DataParameter>(parameter);

并通过以下方法捕获数据:

public override Task Initialize(DataParameter parameter)
{
}

更新 Denis Gordin 的答案,自 MvvmCross 6 以来,您应该在导航到的 class 中使用 Prepare 方法。

public override void Prepare(DataParameter parameter)
{
}