Как правильно привязать 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
).