Caliburn Micro ViewLocator具有不同的命名空间

时间:2016-10-12 12:15:29

标签: c# wpf mvvm namespaces caliburn.micro

我正在使用Caliburn Micro for MVVM。现在我有以下情况。我在assembly1的第一个程序集namespace1中有一个带View和ViewModel的UserControl。如果我在具有相同名称空间assembly2的第二个程序集namespace1中使用它(它在同一个解决方案中),一切正常。

现在,我想在名为Solution的另一个namespace3中使用我的ViewModel。如果我尝试这个,我总是会收到错误,无法找到View。

我构建了一个解决方法,在引导程序中手动设置Binding(使用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);
...
}

这是有效的,但如果我想使用assembly1中的ViewModel,我不会总是手动设置Binding和Singleton。

有没有办法告诉Caliburn ViewLocator视图可能位于不同的命名空间?

我试过跟着不工作......

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

也许有人知道解决方案。

1 个答案:

答案 0 :(得分:2)

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;


    }

为了让Caliburn了解你的新dll。