2011-01-06 16 views
0

Ich habe folgende XAML:Bindung an Itemspresenter Eigenschaft

<ItemsControl ItemsSource="{Binding...}" > 
    <ItemsControl.Template> 
     <ControlTemplate> 
      <ItemsPresenter x:Name="testGrid"/> 
     </ControlTemplate> 
    </ItemsControl.Template> 
    <!--Use the ItemsPanel property to specify a custom UniformGrid that 
    holds the laid out items.--> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <tools:UniformGridRtL Columns="8" x:Name="testGrid2" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <!--Use the ItemTemplate to set a DataTemplate to define 
     the visualization of the data objects. This DataTemplate 
     specifies that each data object appears RegisterBit appears 
     as a CheckBox bound to RegisterBit properties. It also defines 
     a custom template for the checkbox.--> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <CheckBox... /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

<Label> 
    <Binding ElementName="testGrid2" Path="property_of_UniformGridRtL"/> 
</Label> 

Grundsätzlich habe ich ein eigenes Panel (UniformGridRtL) eingestellt als Itemspaneltemplate, das die Itemspresenter im Itemscontrol Vorlage wird. UniformGridRtL hat eine Eigenschaft, an die ich gerne binden möchte, aber ElementName scheint in der Label-Bindung nicht zu funktionieren. Wie kann ich an eine Eigenschaft eines generierten ItemsControl-Elementhosts binden?

Antwort

0

Die ElementName-Bindungsquelle funktioniert nicht für Vorlagenobjekte, selbst für ItemsPanelTemplate-Vorlagen, die normalerweise nur ein einzelnes Vorlagenobjekt haben. Das Problem ist, dass, weil es sich um eine Vorlage handelt, theoretisch theoretisch mehr als eine vorhanden sein kann. Daher weiß WPF nicht, an welches Element sich eine Bindung bindet.

Als Behelfslösung, versuchen Sie, das Loaded-Ereignis des Feldes (in diesem Fall <tools:UniformGridRtL Loaded="grid_Loaded" .../>) abonniert, und dann die Bindung manuell im Code festgelegt:

private void grid_Loaded(object sender, RoutedEventArgs e) 
{ 
    Binding binding = new Binding("NameOfGridPropertyToBindTo"); 
    binding.Source = sender; 
    boundLabel.SetBinding(Label.ContentProperty, binding); 
} 

Der obige Code so etwas wie <Label Name="boundLabel"/> übernimmt für Ihre Label-Erklärung.

+0

Danke für die Umgehung ... Es funktioniert in der Tat, wenn das bindende Ziel auch kein Template-Objekt ist. Was passiert, wenn ich an ein gleichrangiges Element in derselben ItemsControl ControlTemplate binden möchte? – Mart

+0

Wenn Sie ein gleichrangiges Quellenelement haben, verwenden Sie anstelle des Senders (namedItemsControl) .Template.FindName() wie hier beschrieben: http://stackoverflow.com/questions/820201/how-to-access-a-wpf- control-located-in-a-controlletemplate –

+0

Entschuldigung, mein Kommentar wurde abgeschnitten - wenn das Ziel Template ist, können Sie die gleiche Strategie mit Template.FindName() auch verwenden - der Code wird nur ein bisschen unordentlicher. Stellen Sie sicher, dass Sie weiterhin ein Loaded-Ereignis irgendeiner Art verwenden, oder Sie haben noch keine visuelle Struktur und FindName gibt null zurück. –

Verwandte Themen