为什么在XAML中添加的ListBoxItem未设置样式?

时间:2013-08-10 15:22:38

标签: c# silverlight xaml listbox datatemplate

为什么在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并绑定一个列表,那么这些项目都是红色的。

3 个答案:

答案 0 :(得分:3)

“在ItemsControl上设置ItemTemplate时,UI生成如下(以ListBox为例):

  1. 在内容生成期间,ItemsPanel发起对ItemContainerGenerator的请求,以便为每个数据项创建容器。对于ListBox,容器是ListBoxItem。生成器回调到ItemsControl以准备容器。

  2. 部分准备工作涉及将ListBox的ItemTemplate复制为ListBoxItem的ContentTemplate。

  3. 与所有ContentControl类型类似,ListBoxItem的ControlTemplate包含ContentPresenter。应用模板时,它会创建一个ContentPresenter,其ContentTemplate绑定到ListBoxItem的ContentTemplate。

  4. 最后,ContentPresenter将ContentTemplate应用于自身,并创建UI。“

  5. 如您所见above,datatemplate仅用于新生成的项目。此外,数据模板通常用于描述/呈现"the visual structure"数据 - 您的ListBoxItems已被描述为ListBoxItems,因此他们使用该模板...希望这有意义......

答案 1 :(得分:2)

因为示例中的LB1和LB2不是数据模板的一部分。将某些数据绑定到ListBox的ItemsSource时,将根据数据模板显示这些项目。

答案 2 :(得分:2)

您需要申请StyleDataTemplate用于将模板应用于绑定到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>