У меня есть пользовательская панель, где я объявила пользовательское свойство для хранения содержимого (я не хочу использовать 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>
Но когда я хочу использовать панель в качестве элемента ItemsPanelTemplate внутри ItemsControl, атрибут ContentProperty игнорируется и добавляет все в коллекцию Дети, а не в коллекцию PanelContent:
<ItemsControl ItemTemplate="{StaticResource ReviewTemplate}" ItemsSource="{Binding Reviews}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<CustomPanel></CustomPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Это не так, как должно работать. Согласно документации:
Элемент объекта ItemsPanelTemplate должен содержать ровно один класс, основанный на FrameworkElement, который служит в качестве корневого элемента для элементов. В большинстве случаев это класс, созданный Panel. Расширенный шаблон служит в качестве родителя для реализованных элементов, и в целом имеется более одного элемента. Поэтому свойство содержимого XAML для предполагаемого корневого элемента элемента ItemsPanelTemplate должно поддерживать коллекцию, как это делает Panel.Children.