2012-05-03 49 views
1

有沒有可能通過簡單綁定使用多個ViewModels? 這個想法是每個活動都有一個ViewModel。如何使用多個ViewModels與簡單綁定

問候

尼爾斯


我嘗試了基於https://github.com/slodge/MvvmCross/tree/master/Sample%20-%20SimpleDialogBinding/SimpleBinding/SimpleDroid兩個不同的ViewModels測試,但它似乎有一些問題。

我的結構是這樣的:

Activity1     Activity2 
    |      | 
    |      | 
    |      | 
ViewModel1    ViewModel2 

兩個Activites從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); 
    } 

我真的不明白,爲什麼沒有與這兩個不同的ViewModels問題。

回答

0

如果您使用MvvmCross的簡單綁定示例,而沒有使用框架的其餘部分,並且您使用多個ViewModel,那麼您必須找到一些方法在View和ViewModels之間構建查找表。


這樣做將覆蓋你的設置中的protected abstract IDictionary<Type, Type> GetViewModelViewLookup()方法最簡單的方法。

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> {} 

,然後將基部反射代碼會工作。


我不知道任何人的使用這種形式的簡單比演示其他任何約束力 - 大多數用戶都採取板載到目前爲止整個平臺 - 以便你碰到他們,請做後的其他問題。


更新:我現在已經推了MvxSimpleBindingActivityView<TViewModel>到GitHub的 - 你可以如上

MyBaseActivity<TViewModel>描述使用
相關問題