Поддержка времени разработки с помощью агрегатора событий и WIndowManager

Мне нужно создать приложение WPF с Caliburn.Micro 2.0.2 для сдачи экзамена на степень бакалавра.

В этом приложении три разных вида будут отображаться в одной оболочке (окне), и они должны взаимодействовать друг с другом. Поэтому мне нужен агрегатор событий. Мне также нужен менеджер окон, чтобы показать дополнительные диалоги.

Моя настоящая проблема заключается в том, что я должен собрать все это вместе с полной поддержкой времени разработки. К сожалению, нет примера для этого случая.

В документации Caliburn.Micro говорится, что в модели представления требуется конструктор по умолчанию, чтобы обеспечить поддержку времени разработки. Однако агрегатор событий и диспетчер окон используются в качестве параметров конструктора в модели представления, поэтому сначала нет конструктора по умолчанию.

В документации также говорится, что в таком случае для получения поддержки по времени разработки следует использовать ViewModelLocator. К сожалению, раздел о ViewModelLocator не дает мне достаточно информации о том, как это сделать.

Другая идея может заключаться в том, чтобы связывать конструкторы так:

public class ExampleViewModel : PropertyChangedBase
{
    private readonly IEventAggregator eventAggregator;
    private readonly IWindowManager windowManager;

    public ExampleViewModel() : this(null)
    {
    }

    public ExampleViewModel(IEventAggregator eventAggregator) : this(eventAggregator, null)
    {
    }

    public ExampleViewModel(IEventAggregator eventAggregator, IWindowManager windowManager)
    {
        this.eventAggregator = eventAggregator;
        this.windowManager = windowManager;

        // doing everything needed for the Design Time Support
    }
}

Но я понятия не имею, сработает ли это наконец.

Я надеюсь, что кто-то здесь может помочь мне с этим вопросом.

1 ответ

Решение

Вы можете использовать отдельный DataContext (ViewModel) для времени разработки. Вам нужно добавить в свой XAML, где используется модель представления:

<UserControl 
    ...
    xmlns:dt="clr-namespace:YourProject.DesignTimeHelpers;assembly=YouAssembly"
    d:DataContext="{Binding Source={x:Static dt:DesignTimeModels.ExampleViewModelForDesignTime}}">

Существует статический класс DesignTimeModels с моделью представления:

public static class DesignTimeModels
{
    public static ExampleViewModel ExampleViewModelForDesignTime { get; set; }

    // static constructor
    static DesignTimeModels()
    {
        ExampleViewModelForDesignTime = 
            new ExampleViewModel(new EventAggregator(), new WindowManager());
    }
}

Основная идея заключается в создании экземпляра модели представления с помощью статического инициализатора с аргументами, которые вам нужны.

Если вы хотите использовать IoC container (Caliburn например) для мгновенного EventAggregator или WindowManagerВы можете использовать ServiceLocator шаблон. Например:

// static constructor
static DesignTimeModels()
{
    var eventAggregator = ServiceLocator.Get<IEventAggregator>();
    var windowManager = ServiceLocator.Get<IWindowManager>();

    ExampleViewModelForDesignTime = 
        new ExampleViewModel(eventAggregator , windowManager);
}
Другие вопросы по тегам