2013-09-27 89 views
15

我的复杂类型不会从显示传递给Init方法甚至与被配置为MvxJsonNavigationSerializer这里指定Custom types in Navigation parameters in v3传递复杂的导航参数与MvvmCross ShowViewModel

public class A 
{ 
public string String1 {get;set;} 
public string String2 {get;set;} 
public B ComplexObject1 {get;set;} 
} 

public class B 
{ 
public double Double1 {get;set;} 
public double Double2 {get;set;} 
} 

当我通过对象A的实例ShowViewModel方法我收到此String1对象& String2正确反序列化,但CopmlexObject1为null。

如何处理复杂对象MvvmCross序列化?

+0

我能够在我的UIView项目添加mvvmcross JSON插件来解决这个问题。 –

回答

25

我相信有可能是在前面的回答有些捣蛋鬼 - 将记录作为一个问题:/


还有其他可能的途径来实现这种类型的复杂序列化对象的导航仍然使用JSON和压倒一切的部分的框架,但实际上我认为只使用自己的BaseViewModel来进行序列化和反序列化可能会更好 - 例如使用序列代码,如:

public class BaseViewModel 
    : MvxViewModel 
{ 
    private const string ParameterName = "parameter"; 

    protected void ShowViewModel<TViewModel>(object parameter) 
     where TViewModel : IMvxViewModel 
    { 
     var text = Mvx.Resolve<IMvxJsonConverter>().SerializeObject(parameter); 
     base.ShowViewModel<TViewModel>(new Dictionary<string, string>() 
      { 
       {ParameterName, text} 
      }); 
    } 
} 

与反序列化,如:

public abstract class BaseViewModel<TInit> 
    : MvxViewModel 
{ 
    public void Init(string parameter) 
    { 
     var deserialized = Mvx.Resolve<IMvxJsonConverter>().DeserializeObject<TInit>(parameter); 
     RealInit(deserialized); 
    } 

    protected abstract void RealInit(TInit parameter); 
} 

然后视图模型是这样的:

public class FirstViewModel 
    : BaseViewModel 
{ 
    public IMvxCommand Go 
    { 
     get 
     { 
      return new MvxCommand(() => 
       { 
        var parameter = new A() 
         { 
          String1 = "Hello", 
          String2 = "World", 
          ComplexObject = new B() 
           { 
            Double1 = 42.0, 
            Double2 = -1 
           } 
         }; 
        ShowViewModel<SecondViewModel>(parameter); 
       }); 
     } 
    } 
} 

可以浏览到这样的:

public class SecondViewModel 
    : BaseViewModel<A> 
{ 
    public A A { get; set; } 

    protected override void RealInit(A parameter) 
    { 
     A = parameter; 
    } 
} 
+0

登录为https://github.com/slodge/MvvmCross/issues/450 – Stuart

+0

谢谢!有趣的方法,肯定会工作,因为我自己完全控制序列化/反序列化过程。 –

8

一除了Stua RT的答案补充类型安全:

public class BaseViewModel: MvxViewModel { 

    protected bool ShowViewModel<TViewModel, TInit>(TInit parameter) where TViewModel: BaseViewModel<TInit> { 
     var text = Mvx.Resolve<IMvxJsonConverter>().SerializeObject(parameter); 
     return base.ShowViewModel<TViewModel>(new Dictionary<string, string> { {"parameter", text} }); 
    } 
} 

public abstract class BaseViewModel<TInit> : BaseViewModel { 

    public void Init(string parameter) 
    { 
     var deserialized = Mvx.Resolve<IMvxJsonConverter>().DeserializeObject<TInit>(parameter); 
     RealInit(deserialized); 
    } 

    protected abstract void RealInit(TInit parameter); 
} 

ShowViewModel方法现在采用相同的参数类型,该RealInit方法,而不是一个object类型。另外,BaseViewModel<TInit>继承自BaseViewModel,因此他们的实例也可以调用新的ShowViewModel方法。

唯一的缺点是,你必须明确指定这样的调用参数类型:

ShowViewModel<StoreInfoViewModel, Store>(store);