Come usare modello vincolante all'interno modello di dati nel controllo personalizzato (Silverlight)
-
08-10-2019 - |
Domanda
Sto cercando di creare il controllo che avrà ItemsSource
e InnerTemplate
e mostrerà tutti gli elementi avvolti in CheckBox
es.
Il controllo ha 2 proprietà di dipendenza:
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);
ed ecco il template:
<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>
Tuttavia, questo approccio non funziona.
Rilegatura in ControlPresenter.ContentTemplate
utilizzando TemplateBinding
non funziona.
Tuttavia, quando io non uso modello vincolante e di riferimento il modello come risorsa statica, allora funziona come previsto.
- Perché non posso utilizzare il modello vincolante all'interno del presentatore contenuti in DataTemplate?
- Che cosa mi manca qui? Qualsiasi markup speciale richiesta?
- C'è un modo per ottenere il comportamento previsto?
Grazie in anticipo.
Soluzione
TemplateBinding può essere utilizzato solo all'interno di un ControlTemplate, lo si usa all'interno di un DataTemplate. (Il fatto che il DataTemplate è all'interno di un ControlTemplate non importa)
Altri suggerimenti
Silverlight e WPF
È possibile aggirare il problema con una sorgente relativo vincolante:
Al posto di:
{TemplateBinding InnerTemplate}
Si potrebbe usare:
{Binding RelativeSource={RelativeSource AncestorType=local:CheckBoxWrapperList}, Path=InnerTemplate}
E 'un po' disordinata, ma funziona.
WinRT
WinRT non ha AncestorType. Ho qualcosa che le opere, ma è una specie di orribile.
È possibile utilizzare una proprietà collegato a memorizzare un valore TemplateBinding e quindi accedervi utilizzando 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>
Non so se c'è un modo migliore per WinRT.