Диалоговое представление, содержащее два представления Caliburn.Micro?

У меня есть приложение Windows WPF, в котором я использую Caliburn.Micro. Представление/модель представления главного окна обрабатывается Caliburn.Micro. Одна из его кнопок открывает новое диалоговое окно, в котором используется другая модель просмотра.

В этом диалоговом окне у меня есть контейнер (список и некоторые элементы управления фильтрами), который я хочу превратить в повторно используемый элемент управления, чтобы я мог включать его в другие диалоговые окна. Для этого я извлек из представления диалогового окна и модели представления соответствующий код и создал новое представление и модель представления. Все это выглядит хорошо.

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

Из модели представления диалога OnInitalize() я мог бы создать повторно используемую модель представления управления, но я не знаю, как получить ее представление в док-панели представления диалога.

Чтобы создать диалог из модели представления главного окна, я использую WindowManager().ShowDialog() для отображения модели представления для диалога, а Caliburn.Micro позаботится о настройке представления. Есть ли способ указать в XAML диалогового окна, что я хочу внедрить представление для многократно используемого элемента управления, и чтобы Caliburn создал соответствующее представление/модель представления?

Или я иду об этом неправильно?


person DaveK    schedule 10.12.2010    source источник


Ответы (1)


Если у вас есть свойство в вашей модели диалогового представления, которое является другим типом модели представления, и вы добавляете ContentControl в свое диалоговое представление, имя которого совпадает с этим свойством, то Caliburn.Micro автоматически вставит представление, соответствующее вашему представлению свойств. тип модели в заполнитель ContentControl и автоматически привязать этот тип модели представления к представлению. Это то, что вы имеете в виду? Что-то типа:

// Dialog View Model
private MyReusableControlViewModel myReuseableControl;
public MyReusableControlViewModel MyReuseableControl
{ 
   get { return this.myReuseableControl; }
   set { this.myReuseableControl = value;  NotifyOfPropertyChanged(...); }
}

// Dialog View Model Constructor
public DialogViewModel()
{
  this.MyReuseableControl = new MyReusableControlViewModel();
}

// Dialog View
<DockPanel>
  ...
  <ContentControl x:Name="MyReusableControl" />
</DockPanel>

Конечно, в идеале вы хотели бы внедрить любые зависимости модели представления диалога (в данном случае MyReusableControlViewModel) и работать с абстракциями внутри модели представления диалога, а не с конкретными типами.

person devdigital    schedule 10.12.2010
comment
Похоже, это именно то, что я ищу, я попробую. - person DaveK; 13.12.2010
comment
Потратил несколько часов, пытаясь понять это, затем я нашел этот ответ. Большое спасибо, решение оказалось намного проще, чем я думал. - person John the Ripper; 27.04.2012
comment
Хм, это работает, но я пытаюсь связать свойство SelectedItem списка, которое я установил в ctor виртуальной машины, и оно выдает исключение, говорящее, что для него должно быть установлено допустимое значение. Если я удаляю эту привязку, она работает, и даже в дизайнере она правильно устанавливает выбранный элемент. ФУ. - person kamranicus; 10.02.2013