Использование ListBox (или другого ItemsControl) для размещения докладчиков Caliburn
-
05-07-2019 - |
Вопрос
Если у меня есть MultiPresenter
и я использую ListBox
для отображения Presenters
, на которых он размещается, как я могу получить Caliburn для обнаружения и связать виды и модели просмотра для элементов?
Например, если у меня есть простое представление, которое выглядит примерно так:
<UserControl x:Class="MyProject.Views.CarView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<ListBox ItemsSource="{Binding Parts}" />
</Grid>
</UserControl>
Который связан с CarViewModel
:
public class CarViewModel : MultiPresenter
{
public BindableCollection<IPartViewModel> Parts { get; }
}
А коллекция Parts
содержит различные объекты, которые реализуют IPresenter
и имеют соответствующие представления, например, WheelViewModel
и WheelView
, а также EngineViewModel
и EngineView
.
Я бы хотел, чтобы Caliburn разрешил для меня представления, используя стратегию представления. Это возможно? Что мне нужно сделать, чтобы правильно настроить иерархию докладчиков в этом случае?
Решение
Для этого вам не нужно менять иерархию презентаторов. Я только предлагаю вам рассмотреть возможность использования свойства MultiPresenter.Presenters
для сбора дочерних ViewModels и методов MultiPresenter.Open
и MultiPresenter.Shutdown
, если вам нужно для реализации дочернего жизненного цикла ViewModels.
Для проблемы связывания вы должны определить шаблон для элементов ListBox:
<ListBox ItemsSource="{Binding Parts}">
<ListBox.ItemTemplate>
<DataTemplate>
<ContentControl cal:View.Model="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Используя вложенное свойство cal: View.Model
, платформа создает соответствующий View для каждого ViewModel, привязывает его к ViewModel и внедряет его в ContentControl.
Также следует убедиться, что ваше пространство имен и имена классов для Views и ViewModels соответствуют Caliburn соглашение по умолчанию , если вы хотите, чтобы ваши представления корректно определялись фреймворком. В противном случае вам придется написать собственную IViewStrategy (хотя это не сложно).
<Ч>Редактировать: исправлено выражение привязки в свойстве cal: View.Model