Как заставить Calburn.Micro использовать мой многопараметрический конструктор? - PullRequest
0 голосов
/ 12 июля 2011

Когда у меня есть настройка View Model с ImportingConstructor, которая принимает один параметр, вызывается конструктор, и экран отображается правильно.Пример:

    [ImportingConstructor]
    public ShellViewModel(IEventAggregator events)
    {
        events.Subscribe(this);
    }

Однако, основываясь на примерах из Caliburn.Micro, кажется, я должен быть в состоянии предоставить другой конструктор с N параметрами.Пример:

    [ImportingConstructor]
    public ShellViewModel(LeftViewModel left, RightViewModel right, IEventAggregator events)
    {
        Left = left;
        Right = right;

        events.Subscribe(this);
    }

Но эта версия конструктора никогда не вызывается в моей песочнице.Я скомпилировал и запустил пример кода из Caliburn.Micro, который делает именно это;вызывает многопараметрический конструктор(См. Пример проекта Caliburn.Micro «HelloEventAggregator»)

Действительно - когда я запускаю код своей песочницы (вторая версия), конструктор не вызывается, и в качестве начального отображения выбирается другая модель представления.Но в примере HelloEventAggregator их модель оболочки создается и отображается первой.

Что мне нужно сделать, чтобы Caliburn.Micro вызывал мой многопараметрический конструктор и отображал правильный View?

1 Ответ

1 голос
/ 13 июля 2011

Проблема возникла из-за того, что для меня было установлено более одной модели вида с

[Export(typeof(IShell))]

Тип экспорта должен соответствовать ожидаемому [ImportingConstructor], чтобы этот контракт был выполнен.

Пример - ShellViewModel

[Export(typeof(IShell))]
public class ShellViewModel : PropertyChangedBase, IShell
{
    [ImportingConstructor]
    public ShellViewModel(LeftViewModel leftModel)
    {
        ...
    }
    ...
}

Пример - LeftViewModel

[Export(typeof(LeftViewModel))]
public class LeftViewModel : PropertyChangedBase, IShell
{
    [ImportingConstructor]
    public LeftViewModel(IEventAggregator events)
    {
        events.Subscribe(this);
        ...
    }
    ...
}
...