问题描述
|
我正在尝试在Windows Phone 7项目中使用Caliburn Micro。
但是浏览页面时我得到了nullreferenceexception。
namespace Caliburn.Micro.HelloWP7 {
public class MainPageviewmodel {
readonly INavigationService navigationService;
public MainPageviewmodel(INavigationService navigationService) {
this.navigationService = navigationService;
}
public void GotoPageTwo() {
/*navigationService.UriFor<PivotPageviewmodel>()
.WithParam(x => x.NumberOfTabs,5)
.Navigate();*/
navigationService.UriFor<Page1viewmodel>().Navigate();
}
}
}
namespace Caliburn.Micro.HelloWP7
{
public class Page1viewmodel
{
readonly INavigationService navigationService;
public Page1viewmodel(INavigationService navigationService)
{
this.navigationService = navigationService;
}
}
}
谁能告诉我代码的问题是什么?提前致谢。
这是引导程序:
public class ScheduleBootstrapper : PhoneBootstrapper
{
PhoneContainer container;
protected override void Configure()
{
container = new PhoneContainer(RootFrame);
container.RegisterPhoneservices();
container.PerRequest<MainPageviewmodel>();
container.PerRequest<MainContentviewmodel>();
container.PerRequest<Page1viewmodel>();
AddCustomConventions();
}
static void AddCustomConventions()
{
ConventionManager.AddElementConvention<Pivot>(Pivot.ItemsSourceProperty,\"SelectedItem\",\"SelectionChanged\").ApplyBinding =
(viewmodelType,path,property,element,convention) =>
{
if (ConventionManager
.GetElementConvention(typeof(ItemsControl))
.ApplyBinding(viewmodelType,convention))
{
ConventionManager
.ConfigureSelectedItem(element,Pivot.SelectedItemProperty,viewmodelType,path);
ConventionManager
.ApplyHeaderTemplate(element,Pivot.HeaderTemplateProperty,viewmodelType);
return true;
}
return false;
};
ConventionManager.AddElementConvention<Panorama>(Panorama.ItemsSourceProperty,Panorama.SelectedItemProperty,Panorama.HeaderTemplateProperty,viewmodelType);
return true;
}
return false;
};
}
protected override object GetInstance(Type service,string key)
{
return container.GetInstance(service,key);
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
return container.GetAllInstances(service);
}
protected override void BuildUp(object instance)
{
container.BuildUp(instance);
}
}
解决方法
我也有这个,并按以下方式进行跟踪:
如您所知,Caliburn.Micro使用基于约定的约定来定位ViewModel的视图,反之亦然,这意味着我们需要遵循约定。我的错误是使View和ViewModel的ѭ2不一致
就我而言,
MyWP7App.DetailsViewModel
,以及
MyWP7App.Views.DetailsView
->我将VM \的命名空间重命名为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;
};
如果继续调试,您将最终得到一个包含MyWP7App.DetailsView
的集合ѭ11and,并且其全名是ѭ4type,而返回的viewType
则为null ...这就是NullReferenceException的原因。
我99%确信sure15ѭ调用将执行模式匹配,并将VM命名空间中的ViewModels
转换为试图定位的View命名空间中的Views
...