5

v3 で、2 つのオブジェクトを別のビューモデルに渡したい場合:

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

1 に答える 1

11

MvvmCross の既定のナビゲーション メカニズムは、意図的に軽量化されています。

単純なシリアライズ可能なオブジェクトを 1 つだけ渡すことができるようにするために、実際に存在します。

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を(おそらくUrisIntentsやその他のシリアライゼーション手法を使用して) 新しいものに転送し、正しい値で が呼び出されるDogViewModelようにします。Init

シリアル化のため、次のことが重要です。

  • 大きなオブジェクトを渡さないUriでください ( WindowsPhone の は、数百文字を超えると壊れる可能性があります)。
  • 同じオブジェクト インスタンスが到着することを期待しないでください。つまり、データベースに基づくオブジェクトやステートフル オブジェクトを使用している場合は、オブジェクト自体ではなく、ある種のルックアップ キーを渡すことをお勧めします。
  • 1 つの ViewModel だけがメッセージを受信するとは思わないでください。一部のオペレーティング システムでは、ユーザーがアプリ間を何度も行き来するため、多くの View と 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、問題が発生します-いくつかのCagsとDotsが発生します

Cag と Dot の問題があるため、このアプローチはお勧めしません...


アプリでより複雑なトランジションが必要な場合は、次の方法があります。

更新- MvvmCross ShowViewModel で複雑なナビゲーション パラメーターを渡すを参照してください。

1. Json プラグイン (または任意の Json シリアライザー) を追加し、Setup.cs コードを変更して MvxJsonNavigationSerializer を作成します- CreateNavigationSerializerをオーバーライドします

     protected override IMvxNavigationSerializer CreateNavigationSerializer()
     {
         return new MvxJsonNavigationSerializer();
     }
  1. 次のようなナビゲーションで複合オブジェクトを使用します。

    public class DogAndCatNav
    {
       public DogNav DogNav {get;set;}
       public CatNav CatNav {get;set;}
    }
    
  2. これは次のように受け取ります。

    public void Init(DogAndCatNav dogAndCatNav)
    {
    }
    

ただし、この手法には、Json などのより強力なシリアル化エンジンが必要であることに注意してください。


全体的に...これをすべて書いた後でも...ナビゲーションで渡すデータをできるだけ少なくすることをお勧めします!

于 2013-05-14T09:57:05.743 に答える