Использование ListBox (или другого ItemsControl) для размещения докладчиков Caliburn

StackOverflow https://stackoverflow.com/questions/1807630

Вопрос

Если у меня есть 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top