C# Wpf Caliburn.Micro视图未加载

C# Wpf Caliburn.Micro视图未加载,c#,wpf,mvvm,mef,caliburn.micro,C#,Wpf,Mvvm,Mef,Caliburn.micro,我是Wpf和Caliburn的新手,我有下面的场景,我希望得到一些帮助,我确信代码是正确的,但这并没有像预期的那样工作 因此,我的AppBootstrapper是: public class AppBootstrapper : BootstrapperBase { private CompositionContainer _container; public AppBootstrapper() { this.Initialize(); }

我是Wpf和Caliburn的新手,我有下面的场景,我希望得到一些帮助,我确信代码是正确的,但这并没有像预期的那样工作

因此,我的AppBootstrapper是:

public class AppBootstrapper : BootstrapperBase
{
    private CompositionContainer _container;

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

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

    protected override void Configure()
    {
        try
        {
            this._container = new CompositionContainer(new AggregateCatalog(new DirectoryCatalog(".", "*")));

            var batch = new CompositionBatch();

            batch.AddExportedValue<IWindowManager>(new WindowManager());
            batch.AddExportedValue<IEventAggregator>(new EventAggregator());
            batch.AddExportedValue(this._container);
            this._container.Compose(batch);
        }
        catch (Exception ex)
        {
            this._log.Error(ex.ToString());
        }
    }

    protected override object GetInstance(Type service, string key)
    {
        try
        {
            var contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(service) : key;
            var exports = this._container.GetExportedValues<object>(contract);

            if (exports.Any())
            {
                return exports.First();
            }

            throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));
        }
        catch (Exception ex)
        {
            if (ex is ReflectionTypeLoadException)
            {
                var typeLoadException = ex as ReflectionTypeLoadException;
                var loaderExceptions = typeLoadException.LoaderExceptions;
                if (loaderExceptions != null)
                {
                    this._log.Error(loaderExceptions.First().ToString());
                }
            }

            throw;
        }
    }

    protected override IEnumerable<object> GetAllInstances(Type service)
    {
        return this._container.GetExportedValues<object>(AttributedModelServices.GetContractName(service));
    }

    protected override void BuildUp(object instance)
    {
        this._container.SatisfyImportsOnce(instance);
    }
}
公共类AppBootstrapper:BootstrapperBase
{
私有合成容器_容器;
公共AppBootstrapper()
{
这是初始化();
}
启动时受保护的覆盖无效(对象发送方、StartupEventArgs e)
{
这个.DisplayRootViewFor();
}
受保护的覆盖无效配置()
{
尝试
{
this.u container=new CompositionContainer(new AggregateCatalog(new DirectoryCatalog)(“.”,“*”));
var batch=新的CompositionBatch();
AddExportedValue(新的WindowManager());
AddExportedValue(新的EventAggregator());
batch.AddExportedValue(此容器);
此._容器组成(批次);
}
捕获(例外情况除外)
{
此.u log.Error(例如ToString());
}
}
受保护的覆盖对象GetInstance(类型服务,字符串键)
{
尝试
{
var contract=string.IsNullOrEmpty(key)?AttributedModelServices.GetContractName(service):key;
var exports=此._container.GetExportedValues(合同);
if(exports.Any())
{
返回导出;
}
抛出新异常(string.Format(“找不到合同{0}.”,合同的任何实例”);
}
捕获(例外情况除外)
{
如果(ex是ReflectionTypeLoadException)
{
var typeLoadException=ex作为ReflectionTypeLoadException;
var loaderExceptions=typeLoadException.loaderExceptions;
if(loaderExceptions!=null)
{
此.u log.Error(loaderExceptions.First().ToString());
}
}
投掷;
}
}
受保护的重写IEnumerable GetAllInstances(类型服务)
{
返回此._container.GetExportedValues(AttributedModelServices.GetContractName(服务));
}
受保护的覆盖空洞堆积(对象实例)
{
此._container.SatisfyImportsOnce(实例);
}
}
我的ShellViewModel如下(我删除了一些代码以保持简短)

[导出(typeof(ShellViewModel))]
公共类ShellViewModel:导体,
我处理,
我处理,
伊舍尔,
IShellViewModel
{
私有只读ieventagegrator\u事件聚合器;
[导入构造函数]
公共ShellViewModel(IEventAggregator事件聚合器)
{
这。_eventAggregator=eventAggregator;
}
[导入(typeof(LoginViewModel))]
公共Lazy LoginViewModel{get;set;}
已加载的公共void()
{
this.\u eventAggregator.Subscribe(this);
this.ActivateItem(this.loginView模型值);
}
}
我在ShellView.xaml中有一个事件触发器,用于触发上面加载的方法

我还有一个LoginView模型和LoginView(请注意,它们位于项目的ViewModels和Views文件夹中)

LoginView模型的重要一点是

[Export(typeof(LoginViewModel))]
public class LoginViewModel : Screen, IAnimatableViewModel, ILoginViewModel
{
    protected override void OnViewLoaded(object view)
    {
        this._view = view;
        IoC.Get<ShellViewModel>().DisableClose = true;
        base.OnViewLoaded(view);
    }
}
[导出(typeof(LoginViewModel))]
公共类LoginView模型:Screen、IAnimatableViewModel、ILoginViewModel
{
加载视图时受保护的覆盖无效(对象视图)
{
这个._视图=视图;
IoC.Get().DisableClose=true;
base.OnViewLoaded(视图);
}
}
现在LoginView.xaml只显示一些文本

我使用MEF作为DI容器,问题是当我运行应用程序时,会加载ShellView,它应该将LoginView加载到其中,但LoginView不会加载(或不显示)


如果有人能提供帮助,我们将不胜感激。

最好提及并标记您的DI容器。1)您正在导出LoginView模型吗?@eran是的,我正在导出我的DI容器LoginViewModel@Henk我用的是Caliburn是的,很清楚。但问题也涉及到您的DI库(Unity/MEF/Autofac/…),最好提及并标记您的DI容器。1)您是否导出LoginViewModel?@eran是的,我正在导出我的LoginViewModel@Henk我用的是Caliburn是的,很清楚。但这个问题也涉及到您的DI库(Unity/MEF/Autofac/…)
[Export(typeof(LoginViewModel))]
public class LoginViewModel : Screen, IAnimatableViewModel, ILoginViewModel
{
    protected override void OnViewLoaded(object view)
    {
        this._view = view;
        IoC.Get<ShellViewModel>().DisableClose = true;
        base.OnViewLoaded(view);
    }
}