Wie Vorlage verwendet innerhalb Datenvorlage in benutzerdefinierter Kontrollbindung (Silverlight)

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

Frage

Ich versuche Kontrolle zu schaffen, die ItemsSource und InnerTemplate statt und wird alle die verpackten Artikel in CheckBoxes zeigen.

Die Steuerung verfügt über 2 Abhängigkeitseigenschaften:

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

und hier ist die Vorlage:

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

Allerdings ist dieser Ansatz nicht funktioniert.
Die Bindung in ControlPresenter.ContentTemplate TemplateBinding mit nicht funktioniert.
Allerdings, wenn ich die Bindung nicht Vorlage verwenden und die Vorlage als statische Ressource verweisen, dann funktioniert es wie erwartet.

  • Warum kann ich nicht verwenden, um die Vorlage innerhalb des Content-Moderatoren in Datatemplate-Bindung?
  • Was bin ich hier? Eine besondere Auszeichnung erforderlich?
  • Gibt es eine Möglichkeit das erwartete Verhalten zu erreichen?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Template kann nur innerhalb einer Control verwendet werden, sind Sie es in einem Datatemplate verwendet. (Die Tatsache, dass die Datatemplate ist innerhalb eines Control spielt keine Rolle)

Andere Tipps

Silverlight und WPF

Sie können dies umgehen, mit einer relativen Quelle Bindung:

Statt:

{TemplateBinding InnerTemplate}

Sie würden verwenden:

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

Es ist ein bisschen unordentlicher, aber es funktioniert.

WinRT

WinRT nicht AncestorType haben. Ich habe etwas , das funktioniert, aber es ist irgendwie erschreckend.

Sie können eine angefügte Eigenschaft verwenden, um einen Template Wert zu speichern und dann darauf zugreifen Element mit ...

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

Ich weiß nicht, ob es für WinRT ein besserer Weg ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top