ListBox ItemTemplateSelector不起作用

时间:2012-01-09 20:15:56

标签: wpf listbox itemtemplate

我正在尝试在WPF ListBox上使用ItemTemplateSelector,并在线查看了几个示例。看似简单,但我不能让它工作。我希望有人可以告诉我哪里出错了:

Fist,我有一个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简单定义如下:

    <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行的列表,都是'Header Row Test'(因为我的datatemplateselector总是返回DataDocketHeaderTemplate)。但相反,我看到了我的核心数据 第1行 第2行 第3行

这似乎表明我的重写datatemplateselector没有被命中(事实上,如果我在DocketDataTemplateSelector中设置一个断点,我什么时候都看不到它被击中)。我在哪里错了?

由于

1 个答案:

答案 0 :(得分:1)

抱歉,我无法发布此评论,我没有得到足够的分数。

我刚尝试了你的示例代码(我的第一个VB项目)并猜测它是什么,它按预期工作:在黄色背景上三次“Header Row Test”。我将ListBox放在UserControl中的Grid中,然后将UserControl放在Window中的Grid中,然后将UserControl的DataContext设置为带有TestData属性的ViewModel对象。

您的示例代码无法证明某些错误,也许您可​​以提供更多信息。