2009-02-03 3 views
10

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

<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) мое заявление, я заметил, что вся коллекция баров связан с ContentControl, в смену всего 1.

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

ответ

3

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

xmlns:local="clr-namespace:yourenamespace" 

Тогда следующий XAMLWindow.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" /> 

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

+0

Я реализовал это, и он не работает. – Natrium

+1

Предлагаю вам ввести свой объектный код в свой вопрос. В моем ответе была некоторая синтаксическая ошибка, я исправляю ее (Resource, а не Resouce, забыл GridView, я набрал все это рукой). – belaz

+0

Фактически я использую ListBox. Сначала я опубликовал ListView, но я отредактировал это. – Natrium

8

Вы можете просто установить 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>

См Data Binding Overview на MSDN.

+0

ссылка предоставлена, кажется, мертва .. – Default

+0

@Default Да, эта ссылка как сгнившая, и я не могу найти замену извините. Это была просто статья о привязках в WPF. –

Смежные вопросы