Tengo un panel personalizado donde declaré una propiedad personalizada para mantener el contenido (no quiero usar a los niños para el contenido):ItemsPanelTemplate en XAML ignora [ContentProperty] atributo
[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);
}
}
}
Esto funciona perfectamente cuando se usa de esta manera:
<CustomPanel>
<TextBlock>A</TextBlock>
<TextBlock>B</TextBlock>
</CustomPanel>
Pero cuando quiero utilizar el panel como un ItemsPanelTemplate dentro ItemsControl, el atributo ContentProperty se ignora y se añade todo a los niños colección, no el PanelContent colección:
<ItemsControl ItemTemplate="{StaticResource ReviewTemplate}" ItemsSource="{Binding Reviews}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<CustomPanel></CustomPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Ésta no es la forma en que debería funcionar. De acuerdo con documentation:
Un elemento de elemento ItemsPanelTemplate debe contener exactamente una clase derivada de FrameworkElement que sirve como elemento raíz para los elementos. En la mayoría de los casos, esta es una clase derivada del Panel. La plantilla expandida sirve como padre para los elementos realizados y generalmente hay más de un elemento. Por lo tanto, la propiedad de contenido XAML del elemento raíz deseado de una ElementsPanelTemplate debe admitir una colección, como lo hace Panel.Children.
Eso no es del todo cierto. Eche un vistazo al panel 'RichTextColums' que forma parte de todas las aplicaciones de Metro que crea en Visual Studio. –
El panel solo cambia el diseño, RichTextColumns admite el diseño de sus elementos secundarios, lo hace paginación, diseños de columna. Y todo lo que hace es Medir y organizar sus hijos. Buscaré en el código fuente a través del reflector, pero estoy bastante seguro, los paneles no agregan/cambian de estilos. Pueden anular los recursos de estilo, pero la fuente del Panel no contendrá ningún código de estilo. –
De hecho, y eso es exactamente lo que quiero lograr. Nunca dije nada sobre el estilo. Solo quiero usar una propiedad diferente para el contenido (no 'Children').Lamentablemente, el nombre de propiedad especificado no es respetado por 'ItemsControl'. –