2014-06-25 5 views
3

Я смущен относительно того, как привязки разрешаются, когда у меня есть как ItemsSource, так и ItemTemplate в WPF ListBox.WPF ListBox с использованием ItemsSource и ItemTemplate

У меня есть ObservableCollection<int> под названием ListOfIndexes. Для каждого индекса я хочу посмотреть его запись в таблице базы данных. Я надеюсь сделать это в IndexToObjectDescriptionConverter.

<ListBox ItemsSource="{Binding ListOfIndexes}" 
     ItemTemplate="{Binding Converter={StaticResource IndexToObjectDescriptionConverter}}" /> 

Но контрольная точка в преобразователе говорит мне, что значение читается в по ItemTemplate связывания окна сам — т.е. DataContext из ItemsSource и ItemsTemplate то же самое.

Простите немного откровенности, но это кажется DUMB. Вся точка ItemTemplate состоит в том, чтобы отображать каждый элемент в пределах ItemsSource, поэтому, я думаю, я понял, что DataContextItemTemplate будет отдельным визуализируемым элементом.

Итак, как я могу сообщить ItemTemplate, что он должен беспокоиться об отдельных элементах, представленных ItemsSource, а не использовать все окно DataContext?

ответ

6

Вам необходимо использовать шаблон данных для ItemTemplate. Это затем применяются к каждому элементу в списке

MSDN документы здесь: http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemtemplate(v=vs.110).aspx

вопрос о ее контексте данных масштаба. Когда вы связываете какое-либо свойство в ListBox, оно будет использовать контекст данных ListBox - следовательно, почему этот контекст данных передается в конвертер. Если вы установите шаблон данных внутри ItemTemplate, он применит этот шаблон к каждому элементу в списке. Я думаю, на основе простого кода вы условие, что вы должны были бы иметь конвертер внутри шаблона данных:

<ListBox ItemsSource="{Binding ListOfIndexes}"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <ContentControl Content="{Binding Converter={StaticResource IndexToObjectDescriptionConverter}}"/> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

В этом случае ContentControl будет оказан по каждому пункту, с этим элементом, как это контекст данных ,

+1

Perfect. Наверное, я не понимал, что «DataTemplate» в «ItemTemplate» правильно идентифицирует контекст данных, тогда как простое связывание с «ItemTemplate» использует область управления. Благодаря! – Tenner

1

Во-первых, я бы посоветовал вам хорошо прочитать страницу Data Templating Overview в MSDN, чтобы вы могли лучше понять этот процесс привязки данных.

Я хочу посмотреть его запись в таблице базы данных. Я надеюсь сделать это в IndexToObjectDescriptionConverter.

Это ваша первая ошибка. IValueConverter отвечает за преобразование значений данных, не доступ к базам данных. Получите доступ к своим данным в вашей модели просмотра и заполните публичные свойства результатами. Затем данные связывают эти свойства с элементами управления пользовательского интерфейса в XAML.

Pardon немного откровенности, но это, кажется, DUMB

Только те, которые не понимают ситуацию.

как я говорю ItemTemplate, что он должен беспокоиться об отдельных элементах, представленных ItemsSource и не использовать DataContext всего окна в?

Вы не говорите ему ничего ... просто нужно определить правильный XAML достаточно:

В Resources:

<DataTemplate x:Key="SomeDataTemplate"> 
    <!-- The DataContext here is set to an item from the data bound collection --> 
</DataTemplate> 

В XAML:

<ListBox ItemsSource="{Binding ListOfIndexes}" 
    ItemTemplate="{StaticResource SomeDataTemplate}" /> 

Это Это.

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