这是在基本安装类中完成的 – 在https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Platform/MvxBaseSetup.cs中:
protected virtual void InitializeViews() { var container = this.GetService<IMvxViewsContainer>(); foreach (var pair in GetviewmodelViewLookup()) { Add(container,pair.Key,pair.Value); } }
其中GetviewmodelViewLookup将viewmodel类型的字典返回到View类型:
protected virtual IDictionary<Type,Type> GetviewmodelViewLookup(Assembly assembly,Type expectedInterfaceType) { var views = from type in assembly.GetTypes() let viewmodelType = GetviewmodelTypeMappingIfPresent(type,expectedInterfaceType) where viewmodelType != null select new { type,viewmodelType }; return views.ToDictionary(x => x.viewmodelType,x => x.type); }
在通用iPad / iPhone应用程序中,您偶尔会想要为每个视图模型包含多个视图 – 使用iPad中的一个视图和iPhone中的一个视图.
要做到这一点,现在(实际上只是现在!)一些属性可用于将您的视图标记为“非常规” – 这些属性是:
> MvxUnconventionalViewAttribute
>使用此标记表示您的视图永远不应按惯例包含在内
>在https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Views/Attributes/MvxUnconventionalViewAttribute.cs年
> MvxConditionalConventionalViewAttribute
>一个抽象属性 – 覆盖它以提供您自己的包含/排除的自定义逻辑
>在https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Views/Attributes/MvxConditionalConventionalViewAttribute.cs
> MvxFormFactorSpecificViewAttribute
>仅限iOS / Touch
>当且仅当检测到的iPhone外形与当前设备匹配时才包含视图的属性
>在https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Touch/Views/Attributes/MvxFormFactorSpecificViewAttribute.cs
在这种情况下,最后一个可能就是你想要的 – 你可以使用两个声明的视图为Mainviewmodel实现简单的iPhone / iPad切换:
[MvxFormFactorSpecificView(MvxTouchFormFactor.Phone)] public class MyIPhoneView : BaseView<Mainviewmodel> { // iphone specific view ... } [MvxFormFactorSpecificView(MvxTouchFormFactor.Pad)] public class MyIPadView : BaseView<Mainviewmodel> { // ipad specific view ... }
或者,如果你想要一个非常自定义的配置,你可以覆盖所有’基于约定’的行为 – 你可以实现自己的GetviewmodelViewLookup重写 – 例如:
protected override IDictionary<Type,Type expectedInterfaceType) { if (IsIPad) { return new Dictionary<Type,Type>() { { typeof(Homeviewmodel),typeof(IPadHomeView) },{ typeof(Detailviewmodel),typeof(IPadDetailView) },{ typeof(Aboutviewmodel),typeof(SharedAboutView) },}; } else { return new Dictionary<Type,typeof(IPhoneHomeView) },typeof(IPhoneDetailView) },}; } }
请注意,最终您可能会认为您需要额外的viewmodel以及iPad应用程序的视图 – 毕竟iPad具有更大的屏幕 – 在这种情况下,您可以手动添加它们.最终,当您的应用程序达到数百万用户时,您甚至可能决定将平板电脑代码完全从电话代码中分离出来 – 但这通常会等到您达到几百万大关…