2

単純なバインディングで複数の ViewModel を使用する可能性はありますか? アイデアは、アクティビティごとに 1 つの ViewModel を持つことです。

よろしくお願いします

ニルス


https://github.com/slodge/MvvmCross/tree/master/Sample%20-%20SimpleDialogBinding/SimpleBinding/SimpleDroidに基づいて 2 つの異なる ViewModel でテストしようとしましたが、問題があるようです。

私の構造は次のようになります。

Activity1                   Activity2
    |                       |
    |                       |
    |                       |
ViewModel1              ViewModel2

どちらのアクティビティも MvxSimpleBindingActivity を継承しています。

プログラムを実行すると、MvxBaseSetup から System.ArgumentException がスローされます。それが重要な部分です:

   protected IDictionary<Type, Type> GetViewModelViewLookup(Assembly assembly, Type expectedInterfaceType)
    {
        var views = from type in assembly.GetTypes()
                    where !type.IsAbstract
                    && expectedInterfaceType.IsAssignableFrom(type)
                    && !type.Name.StartsWith("Base")
                    let viewModelPropertyInfo = type.GetProperty("ViewModel")
                    where viewModelPropertyInfo != null
                    let viewModelType = viewModelPropertyInfo.PropertyType
                    select new { type, viewModelType };

        return views.ToDictionary(x => x.viewModelType, x => x.type);
    }

これら 2 つの異なる ViewModel に問題がある理由がよくわかりません。

4

1 に答える 1

1

フレームワークの残りの部分を使用せずに MvvmCross の単純なバインディングの例を使用していて、複数の ViewModel を使用している場合は、View と ViewModel の間でルックアップ テーブルを作成する方法を見つける必要があります。


これを行う最も簡単な方法protected abstract IDictionary<Type, Type> GetViewModelViewLookup()は、セットアップ内でメソッドをオーバーライドすることです。

これを次のような単純な Dictionary に置き換えることができます。

return new Dictionary<Type,Type>()
{
{typeof(Activity1), typeof(ViewModel1)},
{typeof(Activity2), typeof(ViewModel2)}
};

または、より「プラットフォーム レベル」の修正が必要な場合は、次のようなビューモデル タイプを設定するアクティビティのジェネリック基本クラスを実装できます。

public class MyBaseActivity<TViewModel>
    : MvxBindingActivityView<MvxNullViewModel>
{
    public new TViewModel ViewModel { get; set; }

    public override object DefaultBindingSource
    {
        get { return ViewModel; }
    }

    protected sealed override void OnViewModelSet()
    {
        // ignored  here
    }
}

アクティビティは次のように継承できます。

public class Activity1 : MyBaseActivity<ViewModel1> {}

public class Activity2 : MyBaseActivity<ViewModel2> {}

そして、基本リフレクション コードが機能します。


この形式の単純なバインドをデモ以外で使用した人がいるかどうかはわかりません。これまでのところ、ほとんどのユーザーがプラットフォーム全体を使用しています。他の問題に遭遇した場合は投稿してください。


更新:を GitHub にプッシュしました-上記のMvxSimpleBindingActivityView<TViewModel>説明に従ってこれを使用できますMyBaseActivity<TViewModel>

于 2012-05-03T12:13:51.867 に答える