v3中导航参数中的自定义类型

时间:2013-05-13 14:14:27

标签: mvvmcross

在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());

1 个答案:

答案 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个对象传输到新UriIntents或其他序列化技术{1}}然后确保使用正确的值调用DogViewModel

由于序列化,重要的是:

  • 传递大对象(WindowsPhone上的Init可以突破几百个字符)
  • 期望相同的对象实例到达 - 即如果您使用的是数据库支持的或有状态的对象,那么最好传递某种查找键而不是对象本身。
  • 期望只有一个ViewModel会收到消息 - 在某些操作系统上,可能是用户在应用程序之间来回多次,导致许多View和ViewModel成为创建。
  • 期望接收消息的ViewModel与发送请求的ViewModel位于相同的进程和内存空间中 - 实际上可能会在逻辑删除事件发生后的几天内收到。< / LI>

如果您确实希望通过导航传递多个对象,那么我认为您可以使用以下代码执行此操作:

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
  1. 在导航中使用复合对象,如:

         protected override IMvxNavigationSerializer CreateNavigationSerializer()
         {
             return new MvxJsonNavigationSerializer();
         }
    
  2. 这将收到:

    public class DogAndCatNav
    {
       public DogNav DogNav {get;set;}
       public CatNav CatNav {get;set;}
    }
    
  3. 但请注意,此技术需要更强大的序列化引擎 - 例如Json。


    总体而言......即使写完所有内容...... 我建议您在导航中尽可能少地传递数据!