如何通过简单的绑定使用多个ViewModel

时间:2012-05-03 11:31:04

标签: c# binding xamarin.android viewmodel mvvmcross

是否有可能使用多个ViewModel和简单的绑定? 我们的想法是为每个Activity提供一个ViewModel。

祝你好运

尼尔斯


我尝试使用基于https://github.com/slodge/MvvmCross/tree/master/Sample%20-%20SimpleDialogBinding/SimpleBinding/SimpleDroid的两个不同的ViewModel进行测试,但似乎存在一些问题。

我的结构如下:

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

我真的不明白为什么这两个不同的ViewModel存在问题。

1 个答案:

答案 0 :(得分:0)

如果您使用MvvmCross中的简单绑定示例而没有框架的其余部分,并且您使用多个ViewModel,则必须找到一些方法在Views和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> {}

然后基本反射代码就可以了。


我不确定是否有人使用这种形式的简单绑定除了演示以外的任何东西 - 大多数用户到目前为止都已经登上了整个平台 - 所以当你遇到它们时请发布其他问题。


更新:我现在已将MvxSimpleBindingActivityView<TViewModel>推送到GitHub - 您可以按上述MyBaseActivity<TViewModel>所述使用此功能