Caliburn.Micro WPF: как я могу создать новую ViewModel, которая имеет зависимость? - PullRequest
0 голосов
/ 28 мая 2018

Я создал одно окно с именем ShellView , которое будет загружать или обрабатывать два пользовательских элемента управления с именами AView и BView .

Iуже есть эта настройка:

Bootstrapper.cs

public class Bootstrapper : BootstrapperBase
{
    private SimpleContainer _container = new SimpleContainer();

    public Bootstrapper()
    {
        Initialize();
    }

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

    protected override void Configure()
    {
        _container.Singleton<IWindowManager, WindowManager>();
        _container.Singleton<IEventAggregator, EventAggregator>();
        _container.RegisterPerRequest(typeof(ShellViewModel), null, typeof(ShellViewModel));
    }

    protected override object GetInstance(Type serviceType, string key)
    {
        return _container.GetInstance(serviceType, key);
    }

    protected override IEnumerable<object> GetAllInstances(Type serviceType)
    {
        return _container.GetAllInstances(serviceType);
    }

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

AViewModel.cs

public class AViewModel : Screen
{
    private IEventAggregator _eventAggregator;

    public AViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator.
    }
}

, и этопроблема, как я могу передать экземпляр агрегатора событий внутри ShellViewModel?

ShellView.cs

public class ShellViewModel : Conductor<Screen>
{
    public ShellViewModel()
    {
        // Should I create an instance and pass it in? If not, how?
        ActivateItem(new AViewModel(?));
    }
}

1 Ответ

0 голосов
/ 28 мая 2018

Caliburn.Micro имеет статический класс с именем IoC для этого.Вы должны сделать что-то вроде этого:

ActivateItem(IoC.Get<AViewModel>());

Или вы можете сделать что-то подобное, если это имеет смысл:

public class ShellViewModel : Conductor<Screen>
{
    private IEventAggregator _eventAggregator;

    public ShellViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        ActivateItem(new AViewModel(_eventAggregator));
    }
}
...