具有不同命名空间的 Caliburn Micro ViewLocator
Caliburn Micro ViewLocator with different namespace
我将 Caliburn Micro 用于 MVVM。现在我有以下情况。我在 namespace1
中的第一个程序集 assembly1
中有一个带有 View 和 ViewModel 的 UserControl。如果我在具有相同命名空间 namespace1
的第二个程序集 assembly2
中使用它(它在同一个解决方案中)一切正常。
现在我想在命名空间 namespace3
的另一个 Solution
中使用我的 ViewModel。如果我尝试这样做,我总是会收到错误消息,无法找到该视图。
我建立了一个解决方法,在引导程序中手动设置绑定(使用 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,我不会总是手动设置绑定并将其设置为单例。
有没有办法告诉 Caliburn ViewLocator
视图可能位于不同的命名空间?
我试过以下没用...
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;
}
为了让 Caliburn 知道你的新 dll。
我将 Caliburn Micro 用于 MVVM。现在我有以下情况。我在 namespace1
中的第一个程序集 assembly1
中有一个带有 View 和 ViewModel 的 UserControl。如果我在具有相同命名空间 namespace1
的第二个程序集 assembly2
中使用它(它在同一个解决方案中)一切正常。
现在我想在命名空间 namespace3
的另一个 Solution
中使用我的 ViewModel。如果我尝试这样做,我总是会收到错误消息,无法找到该视图。
我建立了一个解决方法,在引导程序中手动设置绑定(使用 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,我不会总是手动设置绑定并将其设置为单例。
有没有办法告诉 Caliburn ViewLocator
视图可能位于不同的命名空间?
我试过以下没用...
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;
}
为了让 Caliburn 知道你的新 dll。