从Bootstrapper访问MainViewModel

时间:2011-07-10 14:33:41

标签: c# wpf caliburn.micro

我是Caliburn Micro的新手,想在OnExit期间访问ViewModel属性。

public class AppBootstrapper : Bootstrapper<MainViewModel>
{
    protected override void OnExit(object sender, EventArgs e)
    {
        if (mainViewModel.MyParam == 42)
        {

        }
        base.OnExit(sender, e);
    }

从默认的WP7模板(没有Caliburn)我习惯拥有App.ViewModel,这是一个带有singleton get访问器的静态字段,其中viewmodel将在第一次访问时创建。 (见下一个代码片段)

public partial class App : Application
{
    private static MainViewModel viewModel = null;

    public static MainViewModel ViewModel
    {
        get
        {
            // Delay creation of the view model until necessary
            if (viewModel == null)
                viewModel = new MainViewModel();

            return viewModel;
        }
        set
        {
            viewModel = value;
        }
    }

现在我尝试将Caliburn Micro 1.1与WPF项目一起使用,并且不知道应该如何完成。 我需要在AppBootStrapper内的OnExit期间访问ViewModel。

我认为这应该是可能的,因为我的AppBootstrapper继承自Bootstrapper,但无法找到正确的方法。

任何提示,如何在WPF中完成这项工作都非常受欢迎?

由于 罗布

2 个答案:

答案 0 :(得分:0)

尝试

MainViewModel mainViewModel = IoC.Get<MainViewModel>();

以下是代码的外观:

public class AppBootstrapper : Bootstrapper<MainViewModel>
{
    protected override void OnExit(object sender, EventArgs e)
    {
        // Get the Main View Model
        MainViewModel mainViewModel = IoC.Get<MainViewModel>();
        if (mainViewModel.MyParam == 42)
        {
            //Do work
        }
        base.OnExit(sender, e);
    }
}

这假设有两件事:

  1. 您的MainViewModel类正在导出typeof(MainViewModel)而不是其他不同的东西,例如typeof(IShell)
  2. 您使用的是C.M。
  3. 的默认MEF实现

答案 1 :(得分:0)

在搜索了一下后,我想我找到了自己的问题的解决方案:从这里添加SimpleContainer.cs:link

并将其添加到我的AppBootstrapper代码中:

public class AppBootstrapper : Bootstrapper<MainViewModel>
{

  private SimpleContainer container;

  protected override void Configure()
  {
    container = new SimpleContainer();
    container.RegisterSingleton(typeof(MainViewModel), null, typeof(MainViewModel));
    container.RegisterSingleton(typeof(IWindowManager), null, typeof(WindowManager));
  }

  protected override object GetInstance(Type service, string key)
  {
    return container.GetInstance(service, key);
  }

很高兴听到一些评论,无论这是否合适。