Использование ListBox (или другого ItemsControl) для размещения докладчиков Caliburn - PullRequest
4 голосов
/ 27 ноября 2009

Если у меня есть 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 разрешил для меня представления с использованием стратегии представления. Это возможно? Что мне нужно сделать, чтобы правильно настроить иерархию докладчиков в этом случае?

1 Ответ

8 голосов
/ 27 ноября 2009

Для этого вам не нужно менять иерархию презентаторов. Я предлагаю вам рассмотреть возможность использования свойства 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

...