1

v3 では、MvvmCross がジェネリック宣言<TViewModel>onMvxTouchViewControllerを削除し、名前を に変更したことに気付きましたMvxViewController

これは、プロパティが特定の ではなくViewModel、 のジェネリック インターフェイスとして型指定されていることを意味します。 IMvxViewModelTViewModel

ビュー コントローラーでにアクセスする必要がある場合TViewModel、ViewModel をこのビューの特定のインスタンス タイプに既にキャストする便利な方法はありますか? それとも、毎回自分でキャストする必要がありますか?

4

2 に答える 2

4

以前の 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 ベースのプラットフォームでは、このパターンに反対することを非常に明確に推奨しています。

于 2013-05-28T16:27:05.240 に答える