gpt4 book ai didi

c# - XAML 中的 ItemsPanelTemplate 忽略 [ContentProperty] 属性

转载 作者:可可西里 更新时间:2023-11-01 08:48:58 25 4
gpt4 key购买 nike

我有一个自定义面板,我在其中声明了一个自定义属性来保存内容(我不想为内容使用子项):

[ContentProperty(Name = "PanelContent")]
public class CustomPanel : Panel
{
public static readonly DependencyProperty PanelContentProperty =
DependencyProperty.Register("PanelContent",
typeof(Collection<UIElement>), typeof(CustomPanel),
new PropertyMetadata(new Collection<UIElement>(), null));

public Collection<UIElement> PanelContent
{
get
{
return (Collection<UIElement>)GetValue(PanelContentProperty);
}
}
}

像这样使用时效果很好:

<CustomPanel>
<TextBlock>A</TextBlock>
<TextBlock>B</TextBlock>
</CustomPanel>

但是当我想将面板用作 ItemsControl 中的 ItemsPanelTemplate 时,ContentProperty 属性被忽略并将所有内容添加到 Children 集合,而不是 PanelContent 集合:

<ItemsControl ItemTemplate="{StaticResource ReviewTemplate}" ItemsSource="{Binding Reviews}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<CustomPanel></CustomPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>

这不是它应该的工作方式。根据documentation :

一个 ItemsPanelTemplate 对象元素应该只包含一个 FrameworkElement 派生类,作为项目的根元素。在大多数情况下,这是一个 Panel 派生类。展开的模板作为已实现项目的父级,通常有多个项目。因此,ItemsPanelTemplate 的预期根元素的 XAML 内容属性应该像 Panel.Children 那样支持集合。

最佳答案

负责此任务的面板的 GenerateChildren 方法看起来(如 ILSpy 中所示)

internal virtual void GenerateChildren()
{
IItemContainerGenerator itemContainerGenerator = this._itemContainerGenerator;
if (itemContainerGenerator != null)
{
using (itemContainerGenerator.StartAt(new GeneratorPosition(-1, 0), GeneratorDirection.Forward))
{
UIElement uIElement;
while ((uIElement = (itemContainerGenerator.GenerateNext() as UIElement)) != null)
{
this._uiElementCollection.AddInternal(uIElement);
itemContainerGenerator.PrepareItemContainer(uIElement);
}
}
}
}

如您所见,它总是添加到 this._uiElementCollection,这是支持 Children 属性的字段。

关于c# - XAML 中的 ItemsPanelTemplate 忽略 [ContentProperty] 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11501553/

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