2

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

此致

尼尔斯


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

我的结构如下所示:

Activity1                   Activity2
    |                       |
    |                       |
    |                       |
ViewModel1              ViewModel2

两个 Activity 都继承自 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 会出现问题。

4

1 回答 1

1

如果您使用 MvvmCross 中的简单绑定示例而没有框架的其余部分,并且您正在使用多个 ViewModel,那么您将不得不找到一些方法来构建 View 和 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> {}

然后基本反射代码将起作用。


我不确定是否有人将这种形式的简单绑定用于除演示之外的任何内容 - 到目前为止,大多数用户已经使用了整个平台 - 所以请在遇到其他问题时发布其他问题。


更新:我现在已经将一个推送到 GitHub - 你可以按照上面MvxSimpleBindingActivityView<TViewModel>的描述使用它MyBaseActivity<TViewModel>

于 2012-05-03T12:13:51.867 回答