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 ...这就是Nul​​lReferenceException的原因。 我99%确信sure15ѭ调用将执行模式匹配,并将VM命名空间中的
ViewModels
转换为试图定位的View命名空间中的
Views
...     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...