У меня тоже было это, и я отслеживал это следующим образом:
Как вы знаете, Caliburn.Micro использует соглашение по конфигурации для определения местоположения Views для ViewModels и наоборот, что означает, что нам нужноследовать соглашениям.Моя ошибка состояла в том, что у namespace
было непоследовательное для View и ViewModel
В моем случае у меня было
MyWP7App.DetailsViewModel
и
MyWP7App.Views.DetailsView
-> Я переименовал пространство имен виртуальной машины в MyWP7App.ViewModels.DetailsViewModel
, и оно работало нормально.Я думаю Я мог бы также переместить представление в MyWP7App.DetailsView
для хорошего результата ...
Под прикрытием
вызов Navigate()
вызывает DeterminePageName()
, что, в свою очередь, вызывает ViewLocator.LocateTypeForModelType
Это, как и остальная часть CM, можно переопределить, но реализация по умолчанию выглядит следующим образом:
public static Func<Type, DependencyObject, object, Type> LocateTypeForModelType = (modelType, displayLocation, context) => {
var viewTypeName = modelType.FullName.Substring(
0,
modelType.FullName.IndexOf("`") < 0
? modelType.FullName.Length
: modelType.FullName.IndexOf("`")
);
Func<string, string> getReplaceString;
if (context == null) {
getReplaceString = r => { return r; };
}
else {
getReplaceString = r => {
return Regex.Replace(r, Regex.IsMatch(r, "Page$") ? "Page$" : "View$", ContextSeparator + context);
};
}
var viewTypeList = NameTransformer.Transform(viewTypeName, getReplaceString);
var viewType = (from assembly in AssemblySource.Instance
from type in assembly.GetExportedTypes()
where viewTypeList.Contains(type.FullName)
select type).FirstOrDefault();
return viewType;
};
Если вы следуетев результате отладчика вы получите коллекцию viewTypeList
, содержащую MyWP7App.DetailsView
, и тип с полным именем MyWP7App.Views.DetailsView
, а возвращенный viewType
, следовательно, будет нулевым ... это является причиной исключения NullReferenceException.
Я на 99% уверен, что вызов NameTransformer.Transform
выполнит сопоставление с образцом и преобразует ViewModels
в пространстве имен виртуальной машины в Views
в пространстве имен представления, которое он пытается найти...