Как правильно привязать ListBoxItem в WPF?

У меня есть список и я хочу перебирать коллекцию баров в моем Foo-объекте.

<ListBox DataContext="{Binding Path=Foo.Bars}" >
    <ListBox.Items>
        <ListBoxItem>
            <ContentControl DataContext="{Binding Path=.}" />
        </ListBoxItem>
    </ListBox.Items>
</ListBox>

Это шаблон данных, который я хочу использовать.

<DataTemplate DataType="{x:Type Bar}">
        <Label Content="hello stackoverflow" />
</DataTemplate>

Если я snoop (- > проверьте с помощью инструмента Snoop) мое приложение, я замечаю, что целая коллекция из Bars привязана к ContentControl, вместо всего лишь 1.

Как я могу правильно привязать, чтобы итерация по коллекции прошла нормально?

Ответ 1

Вы можете просто установить DataTemplate, и WPF выполняет всю работу. Установите ItemsSource в список элементов Bar, а затем определите DataTemplate для элементов Bar.

<ListBox ItemsSource="{Binding Path=Foo.Bars}">
    <ListBox.Resources>
        <DataTemplate DataType="{x:Type Bar}">
            <Label Content="hello stackoverflow" />
        </DataTemplate>
    </ListBox.Resources>
</ListBox>

Вы также можете установить ItemsTemplate напрямую, используя <ListBox.ItemTemplate> вместо <ListBox.Resources>

См. Обзор привязки данных в MSDN.

Ответ 2

Сначала добавьте пространство имен в элемент Window (Intellisense):

xmlns:local="clr-namespace:yourenamespace"

Тогда следующий XAML (in Window.Resources - это чистый способ сделать это):

   <Window.Resources>

        <ObjectDataProvider x:Key="DataProvider" ObjectType="{x:Type local:Foo}"/>

        <DataTemplate x:Key="Template" >
           <TextBlock Text="{Binding Bar}"/>
        </DataTemplate>

    </Window.Resources>

Поместите Listbox:

<ListBox DataContext="{Binding Source={StaticResource DataProvider}}" ItemsSource="{Binding Bars}" ItemTemplate="DynamicResource Template" />

Но, это зависит от вашего объекта с кодовым именем, вы должны установить конструктор для инициализации общедоступных свойств внутри вашего объекта, которые ObservableCollection < > предпочтительно (Существуют некоторые правила ограничения с экземпляром объекта в XAML).