コンテンツを保持するカスタム プロパティを宣言したカスタム パネルがあります (コンテンツに Children を使用したくありません)。
[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 属性は無視され、すべてをPanelContentコレクションではなくChildrenコレクションに追加します。
<ItemsControl ItemTemplate="{StaticResource ReviewTemplate}" ItemsSource="{Binding Reviews}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<CustomPanel></CustomPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
これは機能する方法ではありません。ドキュメントによると:
ItemsPanelTemplate オブジェクト要素には、項目のルート要素として機能する FrameworkElement 派生クラスを 1 つだけ含める必要があります。ほとんどの場合、これは Panel 派生クラスです。展開されたテンプレートは実現されたアイテムの親として機能し、通常は複数のアイテムがあります。したがって、ItemsPanelTemplate の目的のルート要素の XAML コンテンツ プロパティは、Panel.Children と同様にコレクションをサポートする必要があります。