C# 如何使用具有简单绑定的多个ViewModels

C# 如何使用具有简单绑定的多个ViewModels,c#,binding,xamarin.android,viewmodel,mvvmcross,C#,Binding,Xamarin.android,Viewmodel,Mvvmcross,是否有可能通过简单绑定使用多个ViewModels? 其思想是为每个活动提供一个ViewModel 致意 零 我尝试使用基于的两种不同的ViewModel进行测试,但似乎存在一些问题 我的结构如下所示: Activity1 Activity2 | | | | | | ViewModel1

是否有可能通过简单绑定使用多个ViewModels? 其思想是为每个活动提供一个ViewModel

致意


我尝试使用基于的两种不同的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);
    }
受保护的IDictionary GetViewModelViewLookup(程序集,类型expectedInterfaceType)
{
var views=来自程序集中的类型。GetTypes()
在哪里!输入IsAbstract
&&expectedInterfaceType.IsAssignableFrom(类型)
&&!type.Name.StartsWith(“Base”)
让viewModelPropertyInfo=type.GetProperty(“ViewModel”)
其中viewModelPropertyInfo!=null
让viewModelType=viewModelPropertyInfo.PropertyType
选择新{type,viewModelType};
返回views.ToDictionary(x=>x.viewModelType,x=>x.type);
}

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

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


最简单的方法是在设置中重写受保护的抽象IDictionary GetViewModelViewLookup()方法

您可以将其替换为一个简单的字典,如:

return new Dictionary<Type,Type>()
{
{typeof(Activity1), typeof(ViewModel1)},
{typeof(Activity2), typeof(ViewModel2)}
};
返回新字典()
{
{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
    }
}
公共类MyBaseActivity
:MvxBindingActivityView
{
公共新TViewModel ViewModel{get;set;}
公共重写对象DefaultBindingSource
{
获取{return ViewModel;}
}
受保护的密封覆盖无效OnViewModelSet()
{
//忽略这里
}
}
然后,您的活动可以继承为:

public class Activity1 : MyBaseActivity<ViewModel1> {}
公共类活动1:MyBaseActivity{}

公共类活动2:MyBaseActivity{}
然后基本反射代码就可以工作了


我不确定是否有人将这种形式的简单绑定用于演示之外的任何其他用途-到目前为止,大多数用户都使用了整个平台-因此,请在遇到其他问题时发布它们


更新:我现在已经将一个
MvxSimpleBindingActivityView
推送到GitHub-您可以像上面
MyBaseActivity
所述那样使用它

public class Activity2 : MyBaseActivity<ViewModel2> {}