Предполагая, что вы используете первый подход ViewModel, проверили ли вы ISceens и реализацию Screen? Текущая загрузка Caliburn.Micro содержит демонстрационный проект с реализацией координатора экрана (SimpleMDI).
Вы можете использовать функцию «Активировать/деактивировать» в основной модели представления для управления переключением между представлениями «свойств».
Основная модель представления должна быть получена из предоставленной caliburn реализации Conductor<T>.Collection.OneActive
, где T должен быть IScreen. Это позволяет вашей основной модели представления активировать только один экран за раз.
По сути, если вы привязываете «выбранный элемент» к свойству в основной модели представления, вы можете отслеживать уведомления об изменении свойства (используя NotifyOfPropertyChange), а затем использовать какую-то процедуру, чтобы решить, на какое представление переключиться.
Caliburn сохранит представления в кэше (используйте GetChildren на вашем проводнике), чтобы вы могли переключаться между ними, сохраняя при этом производительность.
Я использую что-то подобное для динамического создания экземпляров элементов управления на основе базы данных и доступных библиотек (обратите внимание, что мой пример немного сбивает с толку, поскольку CurrentView на самом деле является настраиваемым типом и на самом деле не является представлением — это просто объект базы данных, который описывает элемент управления это было выбрано.. Я, вероятно, должен изменить это!)
public MainPageViewModel : Caliburn.Micro.Conductor<IScreen>.Collection.OneActive
{
#region Property Changed handler
public override void NotifyOfPropertyChange(string propertyName)
{
base.NotifyOfPropertyChange(propertyName);
// A property changed, update the views if it's the CurrentView property
UpdateViews(propertyName);
}
#endregion
private void UpdateViews(string propertyName)
{
// If the selected item in my list changes, it's bound to CurrentView and contains
// the fully qualified typename of the ViewModel that the items 'screen' should use
if (propertyName == "CurrentView")
{
// If the selected item changes we need to load the control or retrieve it from the
// control cache, making sure to update the cache and the active view dictionary
try
{
var controlType = Type.GetType(CurrentView.QualifiedTypeName, true);
// Check to see if the view is already loaded
var view = GetChildren().FirstOrDefault(x => x.GetType() == controlType);
// If it is, just activate it
if (view != null)
{
ActivateItem(view);
}
else
{
// Otherwise it's not loaded, load it and activate it
view = (IScreen)Activator.CreateInstance(controlType);
ActivateItem(view);
}
// etc...
}
}
20.08.2012