10

我刚开始使用 Caliburn.Micro。

我正在尝试引导我的简单示例解决方案,将 ShellView(用户控件)放在 Test.App 程序集中,将 ShellViewModel 放在 Test.ViewModel 程序集中。

我得到的是一个带有以下文本的窗口:“找不到 Caliburn.Test.ViewModel.ShellViewModel 的视图”。

但是,如果我将 ViewModel 移动到 .App 程序集,它会完美运行。

这是 Caliburn.Micro.Test 程序集中的引导程序(可执行文件):

namespace Caliburn.Micro.Test
{
    public class AppBootstrapper : BootstrapperBase
    {
        SimpleContainer container;

        public AppBootstrapper()
        {
            this.Start();
        }

        protected override void Configure()
        {
            container = new SimpleContainer();

            this.container.Singleton<IWindowManager, WindowManager>();
            this.container.Singleton<IEventAggregator, EventAggregator>();
            this.container.PerRequest<IShell, ShellViewModel>();
        }

        protected override object GetInstance(Type service, string key)
        {
            var instance = this.container.GetInstance(service, key);
            if (instance != null)
                return instance;

            throw new InvalidOperationException("Could not locate any instances.");
        }

        protected override IEnumerable<object> GetAllInstances(Type service)
        {
            return this.container.GetAllInstances(service);
        }

        protected override void BuildUp(object instance)
        {
            this.container.BuildUp(instance);
        }

        protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
        {
            this.DisplayRootViewFor<IShell>();
        }

        protected override IEnumerable<System.Reflection.Assembly> SelectAssemblies()
        {

            var assemblies = new List<Assembly>()
            {
                Assembly.GetExecutingAssembly(),
                Assembly.Load("Caliburn.Micro.Test.ViewModel"),
            };

            return assemblies;
        }
    }
}

这是我在 Caliburn.Micro.Test.ViewModel 程序集(类库)中的 ViewModel:

namespace Caliburn.Micro.Test.ViewModel
{
    public interface IShell
    {
    }

    public class ShellViewModel : IShell
    {
    }
}

你能帮我解决我的问题吗?谢谢!:D

4

2 回答 2

20

SelectAssemblies通过在引导程序中覆盖来检查您是否已为 CM 选择了程序集。

这里的文档有一个例子:

http://caliburnmicro.codeplex.com/wikipage?title=Customizing%20The%20Bootstrapper

protected override IEnumerable<Assembly> SelectAssemblies()
{
    return new[] {
        Assembly.GetExecutingAssembly()
    };
}

编辑:

好的,您不仅需要选择程序集来告诉 CM 去哪里看 - 在您的情况下,您的虚拟机和视图可能位于不同的命名空间中,因为您将它们放在不同的库中。您可以在两个库中使用相同的根命名空间,并且标准视图解析应该可以正常工作 - 但是,您需要确保已在引导程序中选择了程序集,以便告诉 CM 尝试解析视图的程序集。

如果您出于某种原因想要将视图/VM 放在不同的命名空间中,则需要自定义 CM 用于解析视图的逻辑。它使用命名约定根据视图模型的完全限定类型名称来定位视图(反之亦然,如果您使用的是视图优先方法)

我建议阅读介绍性文档:

http://caliburnmicro.codeplex.com/wikipage?title=Basic%20Configuration%2c%20Actions%20and%20Conventions&referringTitle=Documentation

然后跟着它走。如果您想直接跳到命名约定,请查看此特定页面:

http://caliburnmicro.codeplex.com/wikipage?title=View%2fViewModel%20Naming%20Conventions&referringTitle=Documentation

http://caliburnmicro.codeplex.com/wikipage?title=Handling%20Custom%20Conventions&referringTitle=Documentation

于 2013-07-04T16:09:09.610 回答
7

感谢这篇文章 http://www.jerriepelser.com/blog/split-views-and-viewmodels-in-caliburn-micro/解决了

编辑:由于您将您的回复与我的整合在一起,我将接受的答案更改为您的。

于 2013-07-04T19:53:37.980 回答