在v3中,如果我想将两个对象传递给另一个视图模型:
public class Dog
{
}
public class Cat
{
}
var dog = new Dog();
var cat = new Cat();
ShowViewModel<SomeViewModel>(new {Dog = dog, Cat = cat });
public class SomeViewModel
{
Init(Dog dog, Cat cat)
{
}
}
据我所知,这样做不会起作用,因为这些类型无法识别,也不能卡在字典中。如果我希望将这些序列化为json,传递给视图模型,并反序列化为Init
参数,我会实现IExtraParser
吗?如果这是正确的,我该如何将实现添加到ExtraParsers
字典?
更新
这似乎是这样做的:
var foo = Mvx.Resolve<IMvxFillableStringToTypeParser>();
foo.ExtraParsers.Add(new MyParser());
答案 0 :(得分:11)
MvvmCross中的默认导航机制是故意轻量级的。
实际上只允许您传递一个简单的可序列化对象 - 例如
public class DogNav
{
public int Id {get;set;}
public string Caption {get;set;}
}
// received in:
public class DogViewModel : MvxViewModel
{
public void Init(DogNav dogNav)
{
}
}
使用此设置,如果触发导航,如:
// navigation
ShowViewModel<DogViewModel>(new DogNav() { Id=12, Caption="Good boy" });
然后底层系统会将{strong>值从DogNav
个对象传输到新Uri
,Intents
或其他序列化技术{1}}然后确保使用正确的值调用DogViewModel
。
由于序列化,重要的是:
Init
可以突破几百个字符)如果您确实希望通过导航传递多个对象,那么我认为您可以使用以下代码执行此操作:
Uri
在这种情况下,您可以使用以下方式导航:
public class CatNav
{
public int CatId {get;set;}
public string CatCaption {get;set;}
}
public class DogNav
{
public int DogId {get;set;}
public string DogCaption {get;set;}
}
// received in:
public class CatAndDogViewModel : MvxViewModel
{
public void Init(DogNav dogNav)
{
}
public void Init(CatNav catNav)
{
}
}
我认为这会奏效......
然而......请注意序列化非常简单 - 因此,如果var catNav = new CatNav() { CatId =12, CatCaption="Meow" };
var dogNav = new DogNav() { DogId =12, DogCaption="Woof" };
var bundle = new MvxBundle();
bundle.Write(catNav);
bundle.Write(dogNav);
ShowViewModel<CatAndDogViewModel>(bundle);
和CatNav
分享属性名称,那么这会导致问题 - 您最终会遇到问题一些Cags和Dots
由于Cag和Dot问题,我不推荐这种方法......
如果您的应用确实需要更复杂的转换,那么一条路线就是:
更新 - 请参阅Passing complex navigation parameters with MvvmCross ShowViewModel
<击> 1.添加Json插件(或任何Json序列化程序)并更改Setup.cs代码以创建MvxJsonNavigationSerializer - 覆盖CreateNavigationSerializer
DogNav
在导航中使用复合对象,如:
protected override IMvxNavigationSerializer CreateNavigationSerializer()
{
return new MvxJsonNavigationSerializer();
}
这将收到:
public class DogAndCatNav
{
public DogNav DogNav {get;set;}
public CatNav CatNav {get;set;}
}
但请注意,此技术需要更强大的序列化引擎 - 例如Json。
总体而言......即使写完所有内容...... 我建议您在导航中尽可能少地传递数据!