[英]Using single View for multiple ViewModels with Caliburn.Micro on Windows Phone 8.1
我有一个使用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, displayLocation, context);
};
单步执行它似乎工作正常。 如果我导航到ViewModel并且ViewModel有一个UseView,我的方法会返回正确的View。
该应用程序导航到正确的视图,但从未创建ViewModel。 有点像Caliburn.Micro忘了ViewModel,或者正在寻找一个使用不同的约定或其他东西。
我发现ViewModelLocator.LocateTypeForViewType
是导航后调用视图来解决视图模型。 上一步中的ViewModel类型似乎完全被遗忘了。
在ViewModelLocator.LocateTypeForViewType
我只能访问View类型,我不知道如何使其解析上一步中正确的ViewModel。 我可以扫描所有ViewModel并找到具有正确属性的ViewModel,但我不知道选择哪一个。
关于如何处理这个的任何想法?
这是一个显示我的设置的最小项目: https : //dl.dropboxusercontent.com/u/73642/CMVMTest.zip
除了顶级导航之外,这种解决方案可以在其他任何地方使用。 这样做的原因是有一种“双重调度:当你导航时继续进行。
如您所知, Frame
或PhoneNavigationFrame
控件(取决于WinRT或Silverlight)是基于其导航的视图。 所以步骤看起来有点像这样。
ProductViewModel
。 ViewLocator
(您已注入代码的位置)来定位ProductView
并告诉Frame
导航到那个。 ProductView
并使用ViewModelLocator
定位正确的视图模型。 这种用于查看导航服务中的模型步骤的视图模型会导致代码中的打嗝。
您应该能够创建简单地继承基本视图并且不添加任何内容的虚拟视图。 因此,如果你有MySharedView.xaml
那么声明下面的内容就足够了。
public class SecondView : MySharedView { }
我知道它并不理想,但确实可以让你重复使用。 让导航服务记住导航事件和导航事件之间的视图模型变得复杂,所有外部因素也会导致导航。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.