windows-phone-7 – MvvmCross – 为多个视图共享视图模型

前端之家收集整理的这篇文章主要介绍了windows-phone-7 – MvvmCross – 为多个视图共享视图模型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在跨平台移动项目中使用MvvmCross,并且在MonoTouch项目中有两个不同的视图,这些视图使用相同的共享视图模型,并且不确定如何构建我的代码以使用MvvmCross中的相同viewmodel导航到不同的视图.
MvvmCross平台使用的默认约定是使用反射自动注册所有视图.

这是在基本安装类中完成的 – 在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具有更大的屏幕 – 在这种情况下,您可以手动添加它们.最终,当您的应用程序达到数百万用户时,您甚至可能决定将平板电脑代码完全从电话代码中分离出来 – 但这通常会等到您达到几百万大关…

原文链接:https://www.f2er.com/windows/365441.html

猜你在找的Windows相关文章