2012-01-09 3 views
1

Я пытаюсь использовать 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, ни разу я вижу его попадание). Где я ошибаюсь?

Благодаря

ответ

1

К сожалению я не могу создавать это как комментарий, я не получил достаточно баллов.

Я просто попробовал ваш пример кода (мой первый проект VB) и угадал, что он работает, как и ожидалось: три раза «Тест заголовка строки» на желтом фоне. Я поместил ListBox в Grid в UserControl, а затем поместил UserControl в грид в окно, а затем установил DataContext объекта UserControl в объект ViewModel с вашим свойством TestData.

Что-то должно быть неправильно, что не показано вашим примером кода, возможно, вы можете предоставить дополнительную информацию.

+0

Ну, это интересно. Моя ошибка, очевидно, в другом месте. Я буду рыть. Спасибо за ваш вклад. – Gatmando

+0

В конечном итоге проблема связана со специальным стилем ListBox, который влияет на все списки ListBoxes в нашем проекте. Клеменс Я отмечаю ваш ответ как ответ, так как вы привели меня к решению. Большое спасибо. – Gatmando

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