首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ListBox ItemTemplateSelector不工作

ListBox ItemTemplateSelector不工作
EN

Stack Overflow用户
提问于 2012-01-10 04:15:56
回答 1查看 926关注 0票数 1

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

首先,我有一个定义如下的DataTemplateSelector类:

代码语言:javascript
复制
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数据模板,直到我可以让它工作。

然后,我让我的用户控制以下内容作为其资源定义:

代码语言:javascript
复制
<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定义如下:

代码语言:javascript
复制
    <ListBox ItemsSource="{Binding TestData}" ItemTemplateSelector="{StaticResource myDataTemplateSelector}"/>

最后,在绑定视图模型中定义我的TestData列表,如下所示:

代码语言:javascript
复制
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行的核心数据

这似乎表明我的覆盖数据平台选择器没有被命中(实际上,如果我在DocketDataTemplateSelector中设置了一个断点,我在任何时候都看不到它被命中)。我在哪里做错了呢?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-10 07:28:44

对不起,我不能把这个作为评论发布,我还没有得到足够的分数。

我刚刚尝试了你的示例代码(我的第一个VB项目),猜猜发生了什么,它像预期的那样工作:在黄色背景上三次"Header Row Test“。我将ListBox放在UserControl的网格中,然后将UserControl放在窗口的网格中,然后使用TestData属性将UserControl的DataContext设置为ViewModel对象。

你的示例代码肯定没有显示出错误的地方,也许你可以提供更多的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8794593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档