【发布时间】:2015-12-07 17:01:17
【问题描述】:
我正在开发 Xamarin Android 应用程序并且我正在使用 MvvmCross。我无法在 Viewmodel 之间传递和检索数据。 解决办法是什么?
【问题讨论】:
标签: android xamarin viewmodel mvvmcross
我正在开发 Xamarin Android 应用程序并且我正在使用 MvvmCross。我无法在 Viewmodel 之间传递和检索数据。 解决办法是什么?
【问题讨论】:
标签: android xamarin viewmodel mvvmcross
这取决于您要检索的数据。对于对象,请查看来自 Stuart 的this answer。
当您想要发送/检索非对象数据时,您可以使用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
例如,您有FooViewModel 和BarViewModel
public class FooViewModel : MvxViewModel {}
public class BarViewModel : MvxViewModel<DataParameter> {}
并且您想将一些数据从 FooVM 传递到 BarVM。 如您所见,BarViewModel 继承自 MvxViewModel,并将 DataParameter 作为泛型类型。这个类描述了我们想要扔给 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 开始,您应该在导航到的类中使用 Prepare 方法。
public override void Prepare(DataParameter parameter)
{
}
【讨论】: