ListBox ItemTemplateSelector не работает - PullRequest
1 голос
/ 10 января 2012

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

Кулак, у меня есть класс 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

Очень просто - просто возвращает шаблон данных 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 в пользовательском элементе управления просто определяется какthis:

    <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

Теперь я ожидаю увидеть список из 3 строк в моем спискевсе говорят «Проверка строки заголовка» (так как мой селектор данных dateate всегда возвращает DataDocketHeaderTemplate).Но вместо этого я вижу свои основные данные строки 1, строки 2, строки 3

Похоже, это указывает на то, что мой переопределяющий элемент dateatemplateselector не ударил (действительно, если я установил точку останова в DocketDataTemplateSelector, я ни разу не увижу егоудар).Куда я не так с этим?

Спасибо

1 Ответ

1 голос
/ 10 января 2012

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

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

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

...