默認的導航機制是故意輕便。
它真的可以讓你傳遞一個簡單的,可序列化的對象 - 例如
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);
我認爲這會工作...
但是......請注意,序列化是很簡單的 - 所以,如果CatNav
和DogNav
是共享屬性名,那麼這將導致一些問題 - 你最終與一些現金援助和點
由於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。
總體......甚至寫這一切之後...... 我建議你在你的導航通過儘可能少的數據越好!
如何在下一個ViewModel上接收MvxBundle對象?我這樣寫:public void Init(MvxBundle objBundle){var = objBundle; }但他們沒有任何objBunlde。它顯示NULL – 2015-07-13 10:28:10