Как я могу использовать привязку данных в WPF для создания нового пользовательского элемента управления для каждого элемента в списке? - PullRequest
4 голосов
/ 31 мая 2010

У меня есть список объектов. Для каждого элемента в списке я хочу создать новый пользовательский элемент управления, связанный с этим элементом. Из того, что я прочитал, делать это программно - плохая практика с WPF (а также менее чем просто), поэтому вместо этого я должен использовать привязку данных. Проблема в том, что я не могу понять, как это сделать. Я не знаю содержимого списка (только тип) во время компиляции, поэтому я не могу создавать и связывать с XAML для каждого элемента. У Google и MSDN, похоже, нет ответов, так что, может быть, я думаю об этом неправильно? Что мне нужно сделать?

Спасибо

РЕДАКТИРОВАТЬ: Чтобы уточнить, я пытаюсь сделать свое собственное программное обеспечение для оценки музыки, что-то вроде Rosegarden. Список будет содержать все меры, а пользовательские элементы управления будут их визуальным представлением.

Ответы [ 3 ]

5 голосов
/ 31 мая 2010

Более общий подход, чем предложенный Жюльеном Лебосквайном (и тот, который будет работать, когда список элементов содержит объекты более чем одного типа данных):

Создать DataTemplate для использования при представлении элементатипа (типов) в вашем списке, например:

<DataTemplate DataType="local:Measure">
   <local:MeasureUserControl DataContext="{Binding}"/>
</DataTemplate>

Используйте ItemsControl для представления элементов:

<ItemsControl ItemsSource="{Binding MeasureList}"/>

Вы можете установить свойство ItemsPanel дляItemsControl - ItemsPanelTemplate для управления тем, как он будет размещать пользовательские элементы управления, например:

<ItemsControl.ItemsPanel>
   <ItemsPanelTemplate>
      <StackPanel Orientation="Horizontal"/>
   </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

Этот подход обычно предпочтительнее использования ListBox, когда вам не нужны функцииListBox, например, его границы по умолчанию и поведение выбора.

4 голосов
/ 31 мая 2010

Вы можете использовать стандарт ListBox с пользовательским стилем элемента:

Где-то в ресурсах:

<Style TargetType="{x:Type ListBoxItem}" x:Key="CustomItemStyle">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type ListBoxItem}">
        <yourns:YourControl />
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

В вашем окне / странице / usercontrol:

<ListBox ItemsSource="{Binding ...}" ItemContainerStyle="{StaticResource CustomItemStyle}" />

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

3 голосов
/ 31 мая 2010

Все вышеприведенные ответы работают, но я оставлю с тем, как я делаю это в моем приложении. Я реализую архитектуру MVVM , которая использует преимущества этих функций WPF. Это UserControl, который я использую, в котором ItemsControl заполнено элементами определенного типа:

<UserControl x:Class="Controls.StepView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:my="clr-namespace:Controls"
    Background="Transparent">

    <UserControl.Resources>
        <DataTemplate DataType="{x:Type my:ParameterViewModel}" >
            <my:ParameterView HorizontalAlignment="Stretch" Margin="25 0 0 0"/> 
        </DataTemplate>
    </UserControl.Resources>

    <Grid>
        <ItemsControl Name="stkStepContent" ItemsSource="{Binding Parameters}" />
    </Grid>
</UserControl>

Позвольте мне объяснить код для вас. в разделе DataTemplate я говорю, что хочу визуализировать объекты класса ParameterViewModel с помощью UserControl ParameterView. Свойство ItemsSource моего ItemsControl привязано к List<ParameterViewModel>. Когда ItemsControl инициируется для каждой ParameterViewModel в Списке, он создает ParameterView и устанавливает свой DataContext равным ParameterViewmodel, который он отображает. Я обнаружил, что этот архитектурный шаблон является наиболее интуитивным для меня при создании приложений WPF.

...