C# 具有不同名称空间的Caliburn Micro ViewLocator

C# 具有不同名称空间的Caliburn Micro ViewLocator,c#,wpf,mvvm,namespaces,caliburn.micro,C#,Wpf,Mvvm,Namespaces,Caliburn.micro,我正在使用Caliburn Micro进行MVVM。现在我有以下情况。我在namespace1中的第一个程序集assembly1中有一个带有View和ViewModel的UserControl。如果我在第二个程序集assembly2中使用它,它具有相同的命名空间namespace1(它在同一个解决方案中),那么一切都可以正常工作 现在我想在另一个解决方案中使用我的ViewModel,使用namespacenamespace3。如果我尝试这个,我总是会得到错误,该视图无法定位 我建立了一个变通方法

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

现在我想在另一个
解决方案
中使用我的ViewModel,使用namespace
namespace3
。如果我尝试这个,我总是会得到错误,该视图无法定位

我建立了一个变通方法,在引导程序中手动设置绑定(使用Ninject)


可能有人知道解决方案。

在您的
配置方法中,您应该使用:

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;


    }
受保护的重写IEnumerable SelectAssemblys()
{
var assemblies=新列表();
assemblies.AddRange(base.selectAssemblys());
//在此加载新的ViewModels
string[]fileEntries=Directory.GetFiles(Directory.GetCurrentDirectory());
assemblies.AddRange(从fileEntries中的文件名开始)
其中fileName.Contains(“ViewModels.dll”)
选择Assembly.LoadFile(文件名));
assemblies.AddRange(从fileEntries中的文件名开始)
其中fileName.Contains(“Views.dll”)
选择Assembly.LoadFile(文件名));
返回组件;
}
为了让Caliburn知道您的新DLL

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;


    }