2013-05-13 91 views
5

在V3導航參數,如果我想兩個物體傳遞到另一個視圖模型:自定義類型在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字典?

更新:

這似乎做到這一點:在MvvmCross

var foo = Mvx.Resolve<IMvxFillableStringToTypeParser>(); 
foo.ExtraParsers.Add(new MyParser()); 
+0

如何在下一個ViewModel上接收MvxBundle對象?我這樣寫:public void Init(MvxBundle objBundle){var = objBundle; }但他們沒有任何objBunlde。它顯示NULL – 2015-07-13 10:28:10

回答

11

默認的導航機制是故意輕便。

它真的可以讓你傳遞一個簡單的,可序列化的對象 - 例如

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" }); 

那麼底層系統將從該DogNav對象輸送 - 可能使用Uri S,Intents或其他串行化技術 - 到新的DogViewModel,然後確保Init被調用正確的值。

由於序列化的,這一點很重要:

  • 通過大對象(Uri S於WindowsPhone的可以突破幾百個字符)
  • 期待獲得同樣的對象實例到達 - 即,如果您使用的是數據庫支持或有狀態的對象,那麼最好傳遞某種查找鍵而不是對象本身。
  • 不是預計只有一個ViewModel會收到消息 - 在某些操作系統上,用戶可能會在應用程序之間來回多次,導致創建許多Views和ViewModel。
  • 不是預計接收到消息的ViewModel與發送請求的ViewModel處於相同的進程和內存空間 - 實際上可能會在邏輯刪除事件發生後的幾天內收到。

如果你想通過導航通過多個對象,那麼我認爲你可以做到這一點使用如下代碼:

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

我認爲這會工作...

但是......請注意,序列化是很簡單的 - 所以,如果CatNavDogNav是共享屬性名,那麼這將導致一些問題 - 你最終與一些現金援助和點

由於CAG和點的問題,我不推薦這種方法的...


如果你需要在你的應用程序更復雜的轉換,然後一個途徑是:

UPDATE - 見Passing complex navigation parameters with MvvmCross ShowViewModel

1.添加JSON的插件(或任何JSON序列)和更改Setup.cs代碼來創建 MvxJsonNavigationSerializer - 首要 CreateNavigationSerializer

 protected override IMvxNavigationSerializer CreateNavigationSerializer() 
    { 
     return new MvxJsonNavigationSerializer(); 
    } 
  • 使用的複合對象中導航等:

    public class DogAndCatNav 
    { 
        public DogNav DogNav {get;set;} 
        public CatNav CatNav {get;set;} 
    } 
    
  • 這將由其接收:

    public void Init(DogAndCatNav dogAndCatNav) 
    { 
    } 
    
  • 但是請注意,這個技術確實 需要一個更強大的序列化引擎 - 如JSON。


    總體......甚至寫這一切之後...... 我建議你在你的導航通過儘可能少的數據越好!

    +0

    我將如何使用NavigationSerializer?即使我用'CreateNavigationSerializer'使用你的建議,MvvmCross仍會嘗試(並失敗)對傳入'ShowViewModel'的對象進行常規序列化? – ronag 2013-07-31 19:29:17

    +0

    如何在下一個ViewModel上接收MvxBundle對象?我這樣寫: public void Init(MvxBundle objBundle) { \t \t var = objBundle; } 但他們沒有什麼objBunlde。它顯示NULL – 2015-07-10 12:35:13