2013-09-27 68 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);