我有一个使用Caliburn.Micro的Windows Phone 8.1应用程序。在应用程序中,我有几个ViewModel以不同的方式和逻辑获取数据,但以相同的方式显示它们。因此,我希望所有这些ViewModel都使用相同的View。
我发现
我发现
ViewLocator.LocateTypeForModelType
是一个用于将ViewModel映射到View的方法。因此,当存在自定义属性时,我重写了它以使用它: 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。
应用程序导航到正确的View,但ViewModel从未被创建。有点像Caliburn.Micro忘记了ViewModel,或者使用不同的约定查找ViewModel之类的东西。
我发现导航到视图后会调用ViewModelLocator.LocateTypeForViewType
以解决ViewModel。上一步中的ViewModel类型似乎完全被遗忘了。
在ViewModelLocator.LocateTypeForViewType
中,我只能访问View类型,我不知道如何使其从上一步解析出正确的ViewModel。我可以扫描所有ViewModel并找到具有正确属性的ViewModel,但我不知道应选择哪个。
有任何想法如何解决这个问题吗?
这是一个最简项目,显示我的设置:https://dl.dropboxusercontent.com/u/73642/CMVMTest.zip