Come usare modello vincolante all'interno modello di dati nel controllo personalizzato (Silverlight)

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

Domanda

Sto cercando di creare il controllo che avrà ItemsSource e InnerTemplate e mostrerà tutti gli elementi avvolti in CheckBoxes.

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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top