2012-05-03 9 views
1

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

敬具

ニルス


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

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

Activity1     Activity2 
    |      | 
    |      | 
    |      | 
ViewModel1    ViewModel2 

両方のactivitesはMvxSimpleBindingActivityから継承します。

プログラムを実行すると、MvxBaseSetupからSystem.ArgumentExceptionがスローされます。これら二つの異なるのviewmodelsに問題があり、なぜ私は本当に理解していない

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); 
    } 

: それは重要な部分です。

答えて

0

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


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

あなたはのような単純な辞書でこれを置き換えることができます:あなたはより多くの「プラットフォーム・レベル」の修正を望んでいた場合

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

、あなたはどのセットあなたの活動のための一般的な基本クラスを実装することができviewmodelタイプのように:

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>で説明したように、あなたはこれを使用することができます
関連する問題