Диалоговое представление, содержащее два представления Caliburn.Micro? - PullRequest
3 голосов
/ 10 декабря 2010

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

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

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

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

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

Или я поступаю неправильно?

1 Ответ

8 голосов
/ 10 декабря 2010

Если у вас есть свойство в вашей модели диалогового представления, которое является другим типом модели представления, и вы добавляете 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) и работать с абстракциями внутри модели диалогового представления, а не с конкретными типами.

...