并非所有ListBoxItem都是相同的

时间:2010-09-04 18:03:44

标签: wpf listbox listboxitem

在下面的示例中,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不能仅仅感谢我做了一些应该做的工作而不是抛出错误? :)

谢谢。

1 个答案:

答案 0 :(得分:2)

这听起来更像是一个警告而不是错误 - 只是告诉你为什么声明的ItemTemplateListBoxItem不能一起工作。

修改

在回复您的评论时,请考虑以下事项:

    <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

  1. 这不是ItemTemplate可以处理的项目,因为ItemTemplateDataTemplate
  2. ListBoxItem可以定义自己的属性,样式和模板。
  3. 因此,如果您明确创建ListBoxItem,我认为WPF更好地尊重自定义该项目样式的能力,而不是使用ItemTemplate覆盖它。

    这就是使用ItemTemplates的美妙之处 - 您可以使用它们,混合,匹配和修改它们,通常不必担心ListBoxItem。我唯一一次直接处理ListBoxItem就是当我为它创建一个样式时 - 明确地将一个作为项目声明可能是一个罕见的情况。