Поддержка времени разработки с помощью агрегатора событий и 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);
}