2009-08-12 8 views
65

Je suis en train de DataBind à ce ItemsControl:Définition des propriétés dans une toile ItemsControl DataTemplate

<ItemsControl ItemsSource="{Binding Path=Nodes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

En utilisant ce DataTemplate, je suis en train de positionner individuellement mes Node éléments correctement sur le Canvas:

<DataTemplate DataType="{x:Type Model:EndNode}"> 
    <Controls:EndNodeControl Canvas.Left="{Binding Path=XPos}" Canvas.Top="{Binding Path=YPos}" /> 
</DataTemplate> 

Cependant, cela ne fonctionne pas comme prévu. Tous mes éléments de noeud sont dessinés les uns sur les autres dans la même position. Des suggestions sur la façon d'accomplir cela?

Répondre

111

Les propriétés attachées ne fonctionnent que sur les enfants directs du canevas. ItemsControl placera les contrôles de ContentPresenter que ses enfants directs, de sorte que vous pouvez ajouter un style pour cela aussi:

<ItemsControl ItemsSource="{Binding Path=Nodes}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemContainerStyle> 
     <Style TargetType="ContentPresenter"> 
      <Setter Property="Canvas.Left" Value="{Binding Path=XPos}" /> 
      <Setter Property="Canvas.Top" Value="{Binding Path=YPos}" /> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 
</ItemsControl> 

Hope this helps

+0

Merci. J'ai trouvé cette solution moi-même il y a environ 5 minutes. Je suppose que j'étais un peu rapide sur la publication de la question. :) – atsjoo

+7

Héhé .. J'aime aussi ces moments AHA;) Et ce n'est pas si mal que ça .. Peut-être que ta question aidera aussi d'autres personnes un jour .. Tu ne le sauras jamais! – Arcturus

+0

Il a en effet, merci à la fois – amaca

Questions connexes