Как правильно связать ListBoxItem в WPF? - PullRequest
10 голосов
/ 03 февраля 2009

У меня есть список, и я хочу перебрать коллекцию Bars в моем 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) мое приложение, я замечаю, что вся коллекция столбцов связана с ContentControl, вместо 1 .

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

Ответы [ 2 ]

8 голосов
/ 03 февраля 2009

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

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

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

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

3 голосов
/ 03 февраля 2009

Сначала добавьте свое пространство имен к элементу 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" />

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...