如何解决Caliburn Micro:如何在Windows Phone Silverlight中导航
| 我正在尝试在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
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。