我正在尝试在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中设置一个断点,我什么时候都看不到它被击中)。我在哪里错了?
由于
答案 0 :(得分:1)
抱歉,我无法发布此评论,我没有得到足够的分数。
我刚尝试了你的示例代码(我的第一个VB项目)并猜测它是什么,它按预期工作:在黄色背景上三次“Header Row Test”。我将ListBox放在UserControl中的Grid中,然后将UserControl放在Window中的Grid中,然后将UserControl的DataContext设置为带有TestData属性的ViewModel对象。
您的示例代码无法证明某些错误,也许您可以提供更多信息。