项目模板:ListBox vs ItemsControl

5

我对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 < p > ItemsControl 没有将模板应用到 ButtonTextBlock 控件。如果我像这样将 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

现在模板被应用于所有子控件(即使我仅将DataType设置为Button)。

1个回答

18

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

一个普通的ItemsControl如果其子元素已经是UI元素,则不会将它们包裹在容器中。而一个ListBox则需要其子元素被包装在一个ListBoxItem中。

如果项被包装,那么ItemTemplate将被应用。如果项没有被包装,那么ItemTemplate也就不存在了。

你几乎总是想向你的ItemsControl添加数据项,而不是UI元素。然后你将DataTemplate与这些数据元素关联,以定义使用哪些UI元素来呈现它们。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接