Comment utiliser le modèle de liaison à l'intérieur de modèle de données dans le contrôle personnalisé (Silverlight)

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

Question

Je suis en train de créer un contrôle qui prendra ItemsSource et InnerTemplate et montrera tous les éléments enveloppés dans CheckBoxes.

Le contrôle a 2 propriétés de dépendance:

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);

et le modèle ici:

<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>

Cependant, cette approche ne fonctionne pas.
Liaison dans le ControlPresenter.ContentTemplate en utilisant TemplateBinding ne fonctionne pas.
Cependant, quand je ne pas utiliser la liaison et de référence modèle le modèle comme ressource statique, il fonctionne comme prévu.

  • Pourquoi ne puis-je utiliser le modèle de liaison à l'intérieur du présentateur contenu DataTemplate?
  • Qu'est-ce que je manque ici? Toute majoration spéciale?
  • Est-il possible d'obtenir le comportement attendu?

Merci à l'avance.

Était-ce utile?

La solution

TemplateBinding ne peut être utilisé dans un ControlTemplate, vous l'utilisez dans un DataTemplate. (Le fait que le DataTemplate est dans un ControlTemplate n'a pas d'importance)

Autres conseils

Silverlight et WPF

Vous pouvez contourner ce avec une liaison de source par rapport:

Au lieu de:

{TemplateBinding InnerTemplate}

Vous utilisez:

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

Il est un peu messier, mais cela fonctionne.

WinRT

WinRT ne pas AncestorType. J'ai quelque chose que les travaux, mais il est un peu horrifiant.

Vous pouvez utiliser une propriété attachée pour stocker une valeur TemplateBinding et y accéder en utilisant 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>

Je ne sais pas s'il y a un moyen pour mieux WinRT.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top