
我发现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 {}
我知道它并不理想,但确实可以让你重复使用.让导航服务记住导航事件和导航事件之间的视图模型变得复杂,所有外部因素也会导致导航.
总结以上是内存溢出为你收集整理的c# – 在Windows Phone 8.1上使用带有Caliburn.Micro的多个ViewModel的单一视图全部内容,希望文章能够帮你解决c# – 在Windows Phone 8.1上使用带有Caliburn.Micro的多个ViewModel的单一视图所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)