Доступ к MainViewModel из Bootstrapper - PullRequest
1 голос
/ 10 июля 2011

Я очень новичок в Caliburn Micro и хотел бы получить доступ к свойствам ViewModel во время OnExit.

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, которыйстатическое поле с одноэлементным аксессором 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 и не знаю, как это сделать.Мне нужен доступ к ViewModel во время OnExit внутри AppBootStrapper.

Я предполагаю, что это должно быть возможно, потому что мой AppBootstrapper унаследован от Bootstrapper, но не может найти правильный способ сделать это ..

Любые советы, как это можно сделать в WPF, приветствуются?

Спасибо, Роб

Ответы [ 2 ]

0 голосов
/ 17 июля 2011

После поиска немного больше, я думаю, что нашел решение для моего собственного вопроса: Добавлен SimpleContainer.cs отсюда: ссылка

и добавил это в мой код 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);
  }

Было бы здорово услышать какой-то комментарий, нормально это или нет.

0 голосов
/ 16 июля 2011

Попробуйте

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. Вы используете стандартную реализацию MEF CM
...