【发布时间】:2016-03-01 18:43:12
【问题描述】:
我有一个使用 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。
应用导航到正确的视图,但从未创建视图模型。有点像 Caliburn.Micro 忘记了 ViewModel,或者正在寻找一个使用不同约定的模型,或者其他什么。
我发现ViewModelLocator.LocateTypeForViewType 在导航到视图以解析视图模型后被调用。上一步中的 ViewModel 类型似乎完全被遗忘了。
在ViewModelLocator.LocateTypeForViewType 中,我只能访问 View 类型,我不知道如何使它从上一步中解析正确的 ViewModel。我可以扫描所有 ViewModel 并找到具有正确属性的那些,但我不知道该选择哪一个。
关于如何解决这个问题的任何想法?
这是一个显示我的设置的最小项目:https://dl.dropboxusercontent.com/u/73642/CMVMTest.zip
【问题讨论】:
标签: c# xaml mvvm windows-phone-8.1 caliburn.micro