不同命名空间的Caliburn Micro ViewLocator



我使用Caliburn Micro for MVVM。现在我有如下情况。我有一个UserControl与视图和视图模型在我的第一个组装assembly1namespace1。如果我在第二个集合assembly2中使用它,具有相同的命名空间namespace1(它在相同的解决方案中),一切都很好。

现在我想使用我的ViewModel在另一个Solution与命名空间namespace3。如果我尝试这样做,我总是得到错误,视图无法定位。

我建立了一个解决方案,在引导程序中手动设置绑定(使用Ninject)。

protected override void Configure()
{
    _kernel = new StandardKernel();
    _kernel.Bind<OverlayManagerView>().To<OverlayManagerView>().InSingletonScope();
    _kernel.Bind<OverlayManagerViewModel>().To<OverlayManagerViewModel>().InSingletonScope();
    base.Configure();
}
protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
{
    ViewModelBinder.Bind(IoC.Get<OverlayManagerViewModel>(), IoC.Get<OverlayManagerView>(), null);
...
}

这是工作,但如果我想使用我的ViewModels从assembly1我不会总是手动设置绑定和作为单例。

有没有办法告诉Caliburn ViewLocator,视图可能是在一个不同的命名空间?

I tried following not working…

        ViewLocator.AddNamespaceMapping("namespace1", "namespace3");
        ViewLocator.AddNamespaceMapping("namespace1", "namespace1");
        ViewLocator.AddNamespaceMapping("namespace3", "namespace1");

也许有人知道解决办法

在你的Configure方法中,你应该使用:

ViewLocator.AddSubNamespaceMapping("ViewModelsNamespace", "ViewsNamespace");

,你必须重写下面的方法:

    protected override IEnumerable<Assembly> SelectAssemblies()
    {
        var assemblies = new List<Assembly>();
        assemblies.AddRange(base.SelectAssemblies());
        //Load new ViewModels here
        string[] fileEntries = Directory.GetFiles(Directory.GetCurrentDirectory());
        assemblies.AddRange(from fileName in fileEntries
                            where fileName.Contains("ViewModels.dll")
                            select Assembly.LoadFile(fileName));
        assemblies.AddRange(from fileName in fileEntries
                            where fileName.Contains("Views.dll")
                            select Assembly.LoadFile(fileName));
        return assemblies;

    }

为了让calburn知道你的新dll

相关内容

  • 没有找到相关文章

最新更新