Caliburn.Micro: различные «цели» в XAML и как получить там View / Viewmodels - PullRequest
4 голосов
/ 27 февраля 2011

Я бы по-прежнему считал себя новичком, хотя мог бы использовать CM с пользой. Я прочитал это хорошее введение на экранах и проводниках и т. Д. От Роба Айзенберга в codeplex. Если я правильно понял, Проводник сам является экраном и может показывать экраны.

Однако я не вижу, как начать достигать чего-то подобного (очень псевдокод):

1007 * XAML *

<Grid>
  <Left x:Name="Menu" />
  <Right x:Name="Content/ActiveItem" />
</Grid>

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

Я пытался понять из примера «HelloScreens», но, к сожалению, у него так много зависимостей, что я не знаю, как заставить его работать. Я вижу, что ShellView, похоже, имеет две целевые области, одна из которых является обычной " ActiveItem ", другая называется " Dialogs ", но поиск строки в "Dialogs" ничего не показывает. В этот момент происходит слишком много магии.

Отсюда мой вопрос. Какова лучшая стратегия, чтобы наконец понять, как заканчиваются представления в XAML и как достичь чего-то, как показано выше с помощью Caliburn.micro?

Приветствия

1 Ответ

4 голосов
/ 28 февраля 2011

Caliburn поставляется с несколькими типами проводников из коробки.Один проводник без набора элементов (кроме ActiveItem) и пара проводников с коллекциями элементов и ActiveItem.

Конечно, вы также можете реализовать свой собственный проводник, но здесь это не кажется необходимым,Звучит так, будто вы просто хотите, чтобы ваш ShellViewModel был дирижером, возможно, тот, у кого он проводит коллекцию предметов, имел бы больше смысла, поэтому вы можете получить ShellViewModel из Conductor<IScreen>.Collection.OneActive.

* 1007.* В вашем меню не нужно выполнять какие-либо пункты, возможно, просто нужна ссылка на коллекцию Items на вашем ShellViewModel.В своем конструкторе ShellViewModel вы можете создать экземпляр каждой из моделей представлений, которые появятся в меню (возможно, лучше использовать абстрактную фабрику), а затем передать ссылку Items на MenuViewModel.

Каждый элемент, который ведет ваш ShellViewModel, может быть получен из Screen, так что он имеет обычный жизненный цикл экрана (OnActivate, OnDeactivate и т. Д.).Ваш MenuViewModel не выполняется и не требует жизненного цикла экрана, поэтому может быть выведен из PropertyChangedBase.

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

ShellViewModel может иметь свойство MainMenu типа MenuViewModel, и ваш вид оболочки будет выглядеть примерно так:

<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="200" />
    <ColumnDefinition Width="*" />
  </Grid.ColumnDefinitions>
</Grid>

<ContentControl x:Name="MainMenu" Grid.Column="0" />
<ContentControl x:Name="ActiveItem" Grid.Column="1" />
...