为什么在XAML中声明的ListBoxItems本身不受DataTemplate的影响?当我绑定一个源代码时,模板很好,这就是我最终要做的事情,但只是想知道为什么声明的项目没有被设置样式。
<ListBox>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding}" Foreground="Red"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBoxItem>LBI 1</ListBoxItem>
<ListBoxItem>LBI 2</ListBoxItem>
</ListBox>
这里LBI 1和LBI 2不是红色但是如果我使用ListBox.ItemSource并绑定一个列表,那么这些项目都是红色的。
答案 0 :(得分:3)
“在ItemsControl上设置ItemTemplate时,UI生成如下(以ListBox为例):
在内容生成期间,ItemsPanel发起对ItemContainerGenerator的请求,以便为每个数据项创建容器。对于ListBox,容器是ListBoxItem。生成器回调到ItemsControl以准备容器。
部分准备工作涉及将ListBox的ItemTemplate复制为ListBoxItem的ContentTemplate。
与所有ContentControl类型类似,ListBoxItem的ControlTemplate包含ContentPresenter。应用模板时,它会创建一个ContentPresenter,其ContentTemplate绑定到ListBoxItem的ContentTemplate。
最后,ContentPresenter将ContentTemplate应用于自身,并创建UI。“
如您所见above,datatemplate仅用于新生成的项目。此外,数据模板通常用于描述/呈现"the visual structure"数据 - 您的ListBoxItems已被描述为ListBoxItems,因此他们使用该模板...希望这有意义......
答案 1 :(得分:2)
因为示例中的LB1和LB2不是数据模板的一部分。将某些数据绑定到ListBox的ItemsSource时,将根据数据模板显示这些项目。
答案 2 :(得分:2)
您需要申请Style
。 DataTemplate
用于将模板应用于绑定到listBox的Data
。因此,不适用于在XAML中直接添加为子项的项目。
<ListBox>
<ListBox.Resources>
<Style TargetType="ListBoxItem">
<Setter Property="Foreground" Value="Red"/>
</Style>
</ListBox.Resources>
<ListBoxItem>LBI 1</ListBoxItem>
<ListBoxItem>LBI 2</ListBoxItem>
</ListBox>