Wie Vorlage verwendet innerhalb Datenvorlage in benutzerdefinierter Kontrollbindung (Silverlight)
-
08-10-2019 - |
Frage
Ich versuche Kontrolle zu schaffen, die ItemsSource
und InnerTemplate
statt und wird alle die verpackten Artikel in CheckBox
es 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.
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.