【问题标题】:Caliburn Micro ViewLocator with different namespace具有不同命名空间的 Caliburn Micro ViewLocator
【发布时间】:2017-02-21 05:48:15
【问题描述】:

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

现在我想在另一个 Solution 中使用我的 ViewModel,命名空间为 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);
...
}

这是可行的,但如果我想使用来自assembly1 的 ViewModel,我不会总是手动设置绑定并将其设置为单例。

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

我试过以下不工作...

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

也许有人知道解决方案。

【问题讨论】:

    标签: c# wpf mvvm namespaces caliburn.micro


    【解决方案1】:

    在你的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。

    【讨论】:

      猜你喜欢
      • 2013-04-27
      • 1970-01-01
      • 2013-08-08
      • 2014-09-27
      • 2011-12-01
      • 2016-03-05
      • 2011-04-10
      • 2020-07-13
      • 1970-01-01
      相关资源
      最近更新 更多