gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:13:35 28 4
gpt4 key购买 nike

我能够在 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,后跟一个蓝色矩形,然后是一个红色矩形。

最佳答案

ItemsControl有 protected 成员 IsItemItsOwnContainerOverride它从 items 集合中传递一个对象并返回 true如果该对象可以在没有生成容器的情况下直接添加到项目面板(从而被模板化)。

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

要获得您期望的行为,您需要从 ItemsControl 继承并覆盖此方法并使其始终返回false。不幸的是,事情还没有结束。 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;
}

关于wpf - 为什么 ItemsControl 不使用我的 ItemTemplate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3843200/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com