2013-04-18 4 views
0

J'ai une collection qui contient elle-même une collection. Maintenant, je veux passer par les deux collections dans wpf. J'essaie de lier la propriété Color de la seconde collection à une propriété Dependency de la première collection. Mais jusqu'à présent, je n'ai pas trouvé un moyen de le lier correctement. Dans le cas de la liaison de visibilité, j'ai trouvé une solution de rechange en liant la propriété Visibility-Property de la disposition de la zone de dessin dans le second ItemsPanelTemplate à la propriété voulue.Contrôles d'éléments imbriqués - Liaison au contrôle supérieur

Voici un morceau de code qui représente ma situation:

<ItemsControl x:Name="Itemcntrl10" ItemsSource="{Binding Collection1}" > 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <Canvas /> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
        <ItemsControl.ItemTemplate> 
         <DataTemplate> 
          <ItemsControl x:Name="Itemcntrl12" ItemsSource="{Binding Collection2}" > 
           <ItemsControl.ItemsPanel> 
            <ItemsPanelTemplate> 
             <Canvas Visibility="{Binding Visibility, Converter={StaticResource BooleanToVisibilityConverter}}" /> 
            </ItemsPanelTemplate> 
           </ItemsControl.ItemsPanel> 
           <ItemsControl.ItemTemplate> 
            <DataTemplate> 
              <Line X1="{Binding X}" Y1="{Binding Y}" 
                X2="{Binding old.X}" Y2="{Binding old.Y}" 
                StrokeThickness="{Binding Path=DataContext.StrokeThickness, ElementName=ThisMainWindow}" 
                > 
              <Line.Stroke> 
               <SolidColorBrush Color="Black" /> 
              </Line.Stroke> 
             </Line> 
            </DataTemplate> 
           </ItemsControl.ItemTemplate> 
          </ItemsControl> 
         </DataTemplate> 
        </ItemsControl.ItemTemplate> 
       </ItemsControl> 

Toute idée comment obtenir ce traité? J'ai pensé à ElementBinding à ItemsControl supérieur mais cela n'a pas résolu mon problème non plus.

Répondre

1

Vous pouvez utiliser un RelativeSource contraignant pour accéder à un élément plus haut dans la VisualTree

Par exemple,

Color="{Binding RelativeSource={RelativeSource AncestorType={x:Type Canvas}}, 
       Path=DataContext.SomeColorProperty}" 

Cela devrait rechercher votre VisualTree pour le plus proche objet Canvas, qui sera celui utilisé dans Itemcntrl12, et il se liera à DataContext, ce qui devrait être un élément de données dans votre premier ItemsControl.

Si vous voulez monter un autre niveau et de se lier à une propriété de la première ItemsControl (Itemcntrl10), vous pouvez utiliser la propriété AncestorLevel de la liaison pour spécifier la 2ème toile au lieu de la première.

+0

Merci beaucoup pour cette réponse rapide! :) – dabuntu

Questions connexes