2009-08-12 8 views
65

próbuję databind do tego ItemsControl:Ustawianie właściwości Canvas w ItemsControl DataTemplate

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

Używając tej DataTemplate, staram się indywidualnie ustawić moje Node elementów na Canvas poprawnie:

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

Jednak nie działa zgodnie z oczekiwaniami. Wszystkie moje elementy węzła są narysowane jeden na drugim w tej samej pozycji. Wszelkie sugestie, jak to osiągnąć?

Odpowiedz

111

Załączone właściwości działają tylko na bezpośrednich elementach potomnych obszaru roboczego. ItemsControl umieści kontroli ContentPresenter jak jego bezpośrednich dzieci, więc może chcesz dodać styl do tego jak dobrze:

<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> 

Nadzieja to pomaga

+0

Dziękuję. Znalazłem to rozwiązanie około 5 minut temu. Myślę, że szybko napisałem pytanie. :) – atsjoo

+7

Hehe ... Uwielbiam także te momenty AHA;) .. I to nie wszystko źle. Może twoje pytanie może pomóc innym ludziom też pewnego dnia ... Nigdy się nie dowiesz! – Arcturus

+0

Rzeczywiście, dzięki zarówno – amaca

Powiązane problemy