是否可以通过简单的绑定使用多个ViewModel?
想法是为每个Activity具有一个ViewModel。

最好的祝福

尼尔斯



我尝试使用基于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);
    }


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

最佳答案

如果您使用的是MvvmCross的简单绑定示例,而没有框架的其余部分,并且您使用的是多个ViewModel,那么您将必须找到某种方法在Views和ViewModels之间构建查找表。



最简单的方法是覆盖设置中的protected abstract IDictionary<Type, Type> GetViewModelViewLookup()方法。

您可以用一个简单的Dictionary代替它:

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>的说明使用它

关于c# - 如何通过简单绑定(bind)使用多个ViewModel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10430481/

10-11 22:30
查看更多