ItemTemplate:ListBox vs ItemsControl

时间:2010-08-13 11:26:19

标签: wpf listbox itemscontrol itemtemplate

我对WPF世界很陌生,我在 ItemsControl 中模板化项目时遇到了一些问题。我需要的是在 ItemsControl (或类似)中模板元素(主要是按钮)。

如果我使用以下XAML代码......

<ItemsControl>
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type Button}">
                <Border BorderBrush="AliceBlue" 
                        BorderThickness="3">
                    <TextBlock Text="Templated!"/>        
                </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <Button>Not templated</Button>
    <TextBlock>Text not templated</TextBlock>
</ItemsControl>

...我得到了这个结果:http://img444.imageshack.us/img444/2167/itemscontrolnottemplate.gif

ItemsControl 未将模板应用于按钮 TextBlock 控件。如果我将 ItemsControl 更改为 ListBox ,就像这样:

<ListBox>
    <ListBox.ItemTemplate>
        <DataTemplate DataType="{x:Type Button}">
                <Border BorderBrush="AliceBlue" 
                        BorderThickness="3">
                    <TextBlock Text="Templated!"/>        
                </Border>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <Button>Not templated</Button>
    <TextBlock>Text not templated</TextBlock>
</ListBox>

...然后我得到了这个结果:img814.imageshack.us/img814/6204/listboxtoomuchtemplatin.gif

现在模板已应用于 BOTH 子控件(即使我将 DataType 设置为 Button )。

1 个答案:

答案 0 :(得分:17)

很难推断出你想要做什么,但看看这是否有帮助......

普通的旧ItemsControl如果已经是UI元素,则不会将其子包装在容器中。另一方面,ListBox要求将其子项包裹在ListBoxItem中。

如果项目已换行,则会应用ItemTemplate。如果项目未被包装,则ItemTemplate也可能不存在。

您几乎总是希望将数据项添加到ItemsControl,而不是UI元素。然后,您将DataTemplate与这些数据元素相关联,以定义用于呈现它们的UI元素。

我认为解释你的最终目标对于进一步帮助是必要的。