Я пытаюсь использовать ItemTemplateSelector в WPF ListBox и посмотрел несколько примеров в Интернете. Было достаточно просто, но я не могу заставить его работать. Я надеюсь, что кто-то может сказать мне, где я пошло не так:ListBox ItemTemplateSelector не работает
Кулак, я класс DataTemplateSelector определяется следующим образом:
Public Class DocketDataTemplateSelector
Inherits DataTemplateSelector
Public Overrides Function SelectTemplate(ByVal item As Object, ByVal container As DependencyObject) As DataTemplate
Return DataDocketHeaderTemplate
End Function
Private _DataDocketHeaderTemplate As DataTemplate
Public Property DataDocketHeaderTemplate() As DataTemplate
Get
Return _DataDocketHeaderTemplate
End Get
Set(ByVal value As DataTemplate)
_DataDocketHeaderTemplate = value
End Set
End Property
Private _DataDocketDataTemplate As DataTemplate
Public Property DataDocketDataTemplate() As DataTemplate
Get
Return _DataDocketDataTemplate
End Get
Set(ByVal value As DataTemplate)
_DataDocketDataTemplate = value
End Set
End Property
End Class
Очень просто - возвращает DataTemplate DataDocketHeaderTemplate для времени не будучи до Я могу заставить его работать.
Я тогда мой пользовательский элемент управления со следующим, как его определение ресурса:
<UserControl.Resources>
<DataTemplate x:Key="docketHeaderTemplate">
<TextBlock Text="Header Row Test" Background="Yellow"/>
</DataTemplate>
<DataTemplate x:Key="docketDataTemplate">
<TextBlock Text="Data Row Test" Background="Green"/>
</DataTemplate>
<local:DocketDataTemplateSelector DataDocketHeaderTemplate="{StaticResource docketHeaderTemplate}" DataDocketDataTemplate="{StaticResource docketDataTemplate}" x:Key="myDataTemplateSelector"/>
</UserControl.Resources>
ListBox'а в пользовательском элементе управления просто определяется, как это:
<ListBox ItemsSource="{Binding TestData}" ItemTemplateSelector="{StaticResource myDataTemplateSelector}"/>
Тогда, наконец, мой список TestData определяется в моей связанной видемоделике так:
Private _listTestData As ObservableCollection(Of String) = Nothing
Public Property TestData As ObservableCollection(Of String)
Get
If _listTestData Is Nothing Then
_listTestData = New ObservableCollection(Of String)
_listTestData.Add("Row 1")
_listTestData.Add("Row 2")
_listTestData.Add("Row 3")
End If
Return _listTestData
End Get
Set(ByVal value As ObservableCollection(Of String))
_listTestData = value
NotifyPropertyChanged("TestData")
End Set
End Property
Теперь, я ожидаю, e список из 3-х строк в моем списке со всеми словами «Header Row Test» (так как мой datatemplateselector всегда возвращает DataDocketHeaderTemplate). Но вместо этого я вижу, мои основные данные из Row 1 Row 2 Row 3
Это показывает, что моя наиважнейшая datatemplateselector не быть пораженным (на самом деле, если я поставил точку останова в DocketDataTemplateSelector, ни разу я вижу его попадание). Где я ошибаюсь?
Благодаря
Ну, это интересно. Моя ошибка, очевидно, в другом месте. Я буду рыть. Спасибо за ваш вклад. – Gatmando
В конечном итоге проблема связана со специальным стилем ListBox, который влияет на все списки ListBoxes в нашем проекте. Клеменс Я отмечаю ваш ответ как ответ, так как вы привели меня к решению. Большое спасибо. – Gatmando