Cómo utilizar la plantilla de unión dentro de la plantilla de datos de control personalizado (Silverlight)

StackOverflow https://stackoverflow.com/questions/4635216

Pregunta

Estoy tratando de crear el control que tendrá ItemsSource y InnerTemplate y mostrará todos los elementos envueltos en CheckBoxes.

El control tiene 2 propiedades de dependencia:

public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(CheckBoxWrapperList), null);
public static readonly DependencyProperty InnerTemplateProperty = DependencyProperty.Register("InnerTemplate", typeof(DataTemplate), typeof(CheckBoxWrapperList), null);

y aquí está la plantilla:

<ControlTemplate TargetType="local:CheckBoxWrapperList">
    <Grid>
        <Grid.Resources>
            <DataTemplate x:Key="wrapper">
                <CheckBox>
                    <ContentPresenter ContentTemplate="{TemplateBinding InnerTemplate}" Content="{Binding}" />
                </CheckBox>
            </DataTemplate>
        </Grid.Resources>
        <ItemsControl ItemTemplate="{StaticResource wrapper}" ItemsSource="{TemplateBinding ItemsSource}" />
    </Grid>
</ControlTemplate>

Sin embargo, este enfoque no funciona.
La unión en ControlPresenter.ContentTemplate usando TemplateBinding no funciona.
Sin embargo, cuando yo no uso la plantilla de unión y de referencia la plantilla como recurso estático, entonces funciona como se esperaba.

  • ¿Por qué no puedo usar la plantilla de unión dentro de la presentadora contenido en DataTemplate?
  • ¿Qué me estoy perdiendo aquí? requiere ningún marcado especial?
  • ¿Hay una manera de conseguir el comportamiento esperado?

Gracias de antemano.

¿Fue útil?

Solución

TemplateBinding sólo se puede utilizar dentro de un ControlTemplate, que se está usando en un DataTemplate. (El hecho de que el DataTemplate está dentro de un ControlTemplate no importa)

Otros consejos

Silverlight y WPF

Se puede evitar esto con una fuente de unión relativa:

En lugar de:

{TemplateBinding InnerTemplate}

Se podría usar:

{Binding RelativeSource={RelativeSource AncestorType=local:CheckBoxWrapperList}, Path=InnerTemplate}

Es un poco más desordenado, pero funciona.

WinRT

WinRT no tiene AncestorType. Tengo algo que las obras, sino que es algo horrible.

Se puede utilizar una propiedad incorporada para almacenar un valor TemplateBinding y luego acceder a ella usando ElementName ...

<ControlTemplate TargetType="local:CheckBoxWrapperList">
    <Grid x:Name="TemplateGrid" magic:Magic.MagicAttachedProperty="{TemplateBinding InnerTemplate}">
        <Grid.Resources>
            <DataTemplate x:Key="wrapper">
                <CheckBox>
                    <ContentPresenter ContentTemplate="{Binding ElementName=TemplateGrid, Path=(magic:Magic.MagicAttachedProperty)}" Content="{Binding}" />
                </CheckBox>
            </DataTemplate>
        </Grid.Resources>
        <ItemsControl ItemTemplate="{StaticResource wrapper}" ItemsSource="{TemplateBinding ItemsSource}" />
    </Grid>
</ControlTemplate>

No sé si hay una manera mejor para WinRT.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top