WPF: просмотр с несколькими подпредставлениями

Я пытаюсь собрать элемент управления в WPF, который имеет дочерние представления.
Количество дочерних просмотров (может увеличиваться или уменьшаться) от 1 до 10. И мне бы хотелось, чтобы основной вид это показывал.
Если возможно, я хотел бы избежать необходимости жестко кодировать каждое представление в файле xaml. Вместо этого я бы хотел, чтобы это было динамично. Я следую шаблону MVVM и хотел бы, чтобы количество представлений соответствовало количеству дочерних моделей представлений в родительской модели представления.

Модели представления тоже выглядят похоже (я упростил код).

    public class ParentViewModel : ObservableObject
    {
        public List<ChildViewModel> Children { get; set; }
    }

    public class ChildViewModel
    { 
    }

Xaml, которого я хотел бы избежать:

    <Grid>

        <views:ChildView DataContext  = "{Binding Children[0]}"/>
        <views:ChildView DataContext  = "{Binding Children[1]}"/>
        <views:ChildView DataContext  = "{Binding Children[2]}"/>
        ... ect 

    </Grid>

Я знаю, что некоторые другие элементы управления в wpf имеют ItemsSource, к которому вы можете привязать список в ViewModels.
Я просто не уверен, как это будет выглядеть, и изо всех сил пытаюсь найти примеры.

Используйте ItemsControl.

Clemens 14.03.2024 23:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
90
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы всегда можете использовать ListBox, чтобы представить список объектов. Свойство ItemTemplate определяет, как на самом деле отображаются элементы данных:

<ListBox ItemsSource = "{Binding Children}">

  <!-- Only use the following ItemContainerStyle to remove the listbox look and feel -->
  <ListBox.ItemContainerStyle>
    <Style TargetType = "ListBoxItem">
      <Setter Property = "Template">
        <Setter.Value>
          <ControlTemplate TargetType=ListBoxItem">
            <ContentPresenter />
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </ListBox.ItemContainerStyle>
  
  <ListBox.ItemTemplate>
    <DataTemplate DataType = "ChildViewModel">
      <views:ChildView />
    </DataContext>
  </ListBox.ItemTemplate>
</ListBox>

Microsoft Learn: Обзор шаблонов данных

Самый простой элемент управления для отображения динамической коллекции элементов представления — это ItemsControl.

Используя свою модель представления, вы должны написать что-то вроде показанного ниже, где ваш ChildView объявлен в файле ItemTemplate. DataContext каждого ChildView автоматически присваивается соответствующему элементу коллекции Children.

<ItemsControl ItemsSource = "{Binding Children}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <views:ChildView/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Панель по умолчанию, используемая ItemsControl, представляет собой вертикальную StackPanel. Вы можете изменить это, установив для свойства ItemsPanel значение ItemsPanelTemplate с другой панелью. Типичными панелями являются горизонтальные StackPanel, WrapPanel и UniformGrid. Сетка также возможна, но вам потребуются свойства модели представления для строки и столбца каждого элемента.

<ItemsControl ItemsSource = "{Binding Children}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <views:ChildView/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Другие вопросы по теме