是否可以通过简单的绑定使用多个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/