在下面的示例中,DataTemplate仅应用于第一个和第二个列表项,第三个和第四个完全被忽略。
<ListBox>
<ListBox.ItemTemplate>
<DataTemplate>
<Button Content="{Binding}"></Button>
</DataTemplate>
</ListBox.ItemTemplate>
<sys:String>One</sys:String>
<sys:String>Two</sys:String>
<ListBoxItem>Three</ListBoxItem>
<ListBoxItem>Four</ListBoxItem>
</ListBox>
我的问题是为什么?
如果我查看输出窗口,我会看到以下错误:“ItemConmplate和ItemTemplateSelector会被ItemsControl的容器类型的项目忽略;类型= 'ListBoxItem的'。
所以我明白为什么我的模板没有被应用,但为什么当我在列表项上明确使用ListBoxItems对象时,WPF会让我感到讨厌?我的意思是,WPF隐含地在ListBoxItems对象上托管 ALL 项目,那么为什么WPF不能仅仅感谢我做了一些应该做的工作而不是抛出错误? :)
谢谢。
答案 0 :(得分:2)
这听起来更像是一个警告而不是错误 - 只是告诉你为什么声明的ItemTemplate
和ListBoxItem
不能一起工作。
在回复您的评论时,请考虑以下事项:
<ListBox>
<ListBox.ItemTemplate>
<DataTemplate>
<Button Content="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.Items>
<System:String>One</System:String>
<System:String>Two</System:String>
<ListBoxItem Background="Red">Three</ListBoxItem>
<ListBoxItem>
<ListBoxItem.Template>
<ControlTemplate>
<Button Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}"
Background="Blue"
Foreground="White"
/>
</ControlTemplate>
</ListBoxItem.Template>
<ListBoxItem.Content>
Four
</ListBoxItem.Content>
</ListBoxItem>
</ListBox.Items>
</ListBox>
将ItemTemplate
视为定义显示项类型的方法。对于作为字符串的“一”和“两”项,ItemTemplate
定义了如何显示该内容, 将结果包装在ListBoxItem
中
但是,如果项目已经 ListBoxItem
ItemTemplate
可以处理的项目,因为ItemTemplate
是DataTemplate
,ListBoxItem
可以定义自己的属性,样式和模板。因此,如果您明确创建ListBoxItem
,我认为WPF更好地尊重自定义该项目样式的能力,而不是使用ItemTemplate
覆盖它。
这就是使用ItemTemplates
的美妙之处 - 您可以使用它们,混合,匹配和修改它们,通常不必担心ListBoxItem
。我唯一一次直接处理ListBoxItem
就是当我为它创建一个样式时 - 明确地将一个作为项目声明可能是一个罕见的情况。