我发现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 {}
我知道它并不理想,但确实可以让你重复使用.让导航服务记住导航事件和导航事件之间的视图模型变得复杂,所有外部因素也会导致导航.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。