以前の Generic ベースの MvvmCross ビューは、主に Objective-C ベースのプラットフォームでの「Heizenbugs」の脅威により、MvvmCross から削除されました。
について誰も知らないことについては、 http://forums.xamarin.com/discussion/771/exporting-generic-type-to-objc-supportedHeizenbugs
を参照してください。
私は Heizenbug を見たことがないと思いますが、Xamarinのアドバイスは、何としてでも回避するように明確に示されていました。たとえば、コンパイラを 2 回変更して、ジェネリックに対してエラーを発行しました。実際、.Mac ではこのような一般的なコードは現在でもエラーのままですが、.iOS では非常に恐ろしい警告です。
これに加えて、ジェネリック基本クラスから継承するときに Xaml ベースのプラットフォームでいくつかの問題が発生しましたが、これらは主に解決されました (たとえば、ジェネリック基本クラスからページを継承すると XamlParseException が発生します) 。
(さておき - いくつかの後方互換性を確保するために、WindowsPhone には制限付きの一般的な View サポートがまだいくつかありますが、これは としてマークされており、これを存続さObsolete
せたことを後悔しています...)
幸いなことに、私の経験では、View の大部分は ViewModel の型を知る必要はありません。代わりに、View の大部分は、型指定された ViewModel を宣言せずに「純粋なバインディング」で構築できます。
ViewModel タイプを知る必要がある残りのビューについては、単純な追加プロパティでこれをすばやく追加できます。
protected MyViewModel MyViewModel
{
get { return (MyViewModel)base.ViewModel; }
/* set is optional - not typically needed
set { base.ViewModel = value; }
*/
}
または、必要に応じて、おそらくこれの拡張メソッドを作成できます-たとえば、次のようなものです。
public static TViewModel TypedViewModel<TViewModel>(this IMvxView view) where TViewModel : class, IMvxViewModel
{
return view.ViewModel as TViewModel;
}
非常に代わりに....
……お化けとかゴブリンとか怖くないならHeizenbugs
…… 。
すべてのビューにプロパティを追加する 1 つの方法は、TypedViewModel
ジェネリックをビュー階層に追加し直すことです。これは簡単に行うことができます。
public class BaseActivity<TViewModel> : MvxActivity
where TViewModel : class, IMvxViewModel
{
protected TViewModel TypedViewModel
{
get { return (TViewModel)base.ViewModel; }
/* set is optional - not typically needed
set { base.ViewModel = value; }
*/
}
}
これで問題なく動作するはずですが、Heizenbug に遭遇した場合、誰もあなたを助けることができないと思います。Xamarin は、特に objC ベースのプラットフォームでは、このパターンに反対することを非常に明確に推奨しています。