温馨提示:本文翻译自stackoverflow.com,查看原文请点击:wpf - Why Does ItemsControl Not Use My ItemTemplate?
itemscontrol itemtemplate silverlight wpf

wpf - 为什么ItemsControl不使用我的ItemTemplate?

发布于 2020-05-28 11:10:36

我能够在ItemsControl中使用ItemTemplate来以特定格式呈现项目。但是,如果ItemsControl中的某个项目恰好是一个TextBox,则将呈现该TextBox而不是ItemsTemplate的实例。据我所知,对于任何FrameworkElement都是如此。这是ItemsControl的预期行为,还是我做错了什么?

一个例子:

<ItemsControl>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Grid Margin="5">
        <Rectangle Fill="Blue" Height="20" Width="20" />
      </Grid>
    </DataTemplate>
  </ItemsControl.ItemTemplate>
  <ItemsControl.Items>
    <sys:Object />
    <TextBox />
    <sys:Object />
    <Rectangle Fill="Red" Height="20" Width="20" />
  </ItemsControl.Items>
</ItemsControl>

我希望它显示四个蓝色矩形。我认为,每当定义了ItemTemplate时,集合中的每个项目都将呈现为模板的实例。但是,在这种情况下,将呈现以下内容:蓝色矩形,然后是TextBox,然后是蓝色矩形,再是红色矩形。

查看更多

提问者
Drew
被浏览
24
AnthonyWJones 2010-10-02 19:32

ItemsControl具有受保护构件IsItemItsOwnContainerOverride被传递从项集合并返回一个对象true,如果该对象可以被直接添加到项目面板而不产生的容器(和由此模板)。

对于从派生的任何对象,基本实现均返回true UIElement

要获得您期望的行为,您将需要继承ItemsControl并重写此方法,并使该方法始终返回false。不幸的是,这还没有结束。如果该项为a 默认的实现PrepareContainerForItemOverride仍然不会将分配ItemTemplate给容器,UIElement因此您也需要覆盖此方法:-

    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return false;
    }


    protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        base.PrepareContainerForItemOverride(element, item);
        ((ContentPresenter)element).ContentTemplate = ItemTemplate;
    }