加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在Windows Phone 8.1上使用带有Caliburn.Micro的多个ViewM

发布时间:2020-12-15 20:56:58 所属栏目:百科 来源:网络整理
导读:我有一个使用Caliburn.Micro的 Windows Phone 8.1应用程序.在应用程序中,我有一些ViewModel以不同的方式和不同的逻辑获取数据,但以相同的方式显示它们.所以我想让所有那些ViewModel使用相同的View. 我发现ViewLocator.LocateTypeForModelType是一个为将ViewM
我有一个使用Caliburn.Micro的 Windows Phone 8.1应用程序.在应用程序中,我有一些ViewModel以不同的方式和不同的逻辑获取数据,但以相同的方式显示它们.所以我想让所有那些ViewModel使用相同的View.

我发现ViewLocator.LocateTypeForModelType是一个为将ViewModels映射到Views而执行的方法.所以我重写它以在使用时使用我的自定义属性:

var original = ViewLocator.LocateTypeForModelType;

        ViewLocator.LocateTypeForModelType = (modelType,displayLocation,context) =>
        {
            var useViewAttributes = modelType.GetTypeInfo().GetCustomAttributes<UseViewAttribute>(true);

            if (useViewAttributes.Count() == 1)
            {
                var viewTypeName = string.Concat(modelType.Namespace.Replace("Model",string.Empty),".",useViewAttributes.First().ViewName);
                var type = AssemblySource.FindTypeByNames(new List<string>() { viewTypeName });
                return type;
            }

            return original(modelType,context);
        };

单步执行它似乎工作正常.如果我导航到ViewModel并且ViewModel有一个UseView,我的方法会返回正确的View.

该应用程序导航到正确的视图,但从未创建ViewModel.有点像Caliburn.Micro忘了ViewModel,或者正在寻找一个使用不同的约定或其他东西.

我发现导航到View以解析ViewModel后会调用ViewModelLocator.LocateTypeForViewType.上一步中的ViewModel类型似乎完全被遗忘了.

在ViewModelLocator.LocateTypeForViewType中,我只能访问View类型,我不知道如何使其解析上一步中正确的ViewModel.我可以扫描所有ViewModel并找到具有正确属性的ViewModel,但我不知道选择哪一个.

关于如何处理这个的任何想法?

这是一个显示我的设置的最小项目:https://dl.dropboxusercontent.com/u/73642/CMVMTest.zip

解决方法

除了顶级导航之外,这种解决方案可以在其他任何地方使用.这样做的原因是有一种“双重调度:当你导航时继续进行.

如您所知,Frame或PhoneNavigationFrame控件(取决于WinRT或Silverlight)是基于其导航的视图.所以步骤看起来有点像这样.

>您的代码告诉导航servie = ce导航到ProductViewModel.
>它使用ViewLocator(您已注入代码的位置)来定位ProductView并告诉Frame导航到那个.
>导航服务然后响应导航事件到ProductView并使用ViewModelLocator定位正确的视图模型.
>然后实例化并绑定此视图模型.

这种用于查看导航服务中的模型步骤的视图模型会导致代码中的打嗝.

您应该能够创建简单地继承基本视图并且不添加任何内容的虚拟视图.因此,如果你有MySharedView.xaml,那么声明下面的内容就足够了.

公共类SecondView:MySharedView {}

我知道它并不理想,但确实可以让你重复使用.让导航服务记住导航事件和导航事件之间的视图模型变得复杂,所有外部因素也会导致导航.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读