2009-08-12 3 views
65

Я пытаюсь привязка к этому ItemsControl:Настройка свойств Canvas в ItemsControl DataTemplate

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

С помощью этого DataTemplate я пытаюсь индивидуально позиционировать свои Node элементы на Canvas правильно:

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

Однако, он не работает должным образом. Все мои элементы узла нарисованы друг над другом в одной и той же позиции. Любые предложения о том, как это сделать?

ответ

111

Прилагаемые свойства действуют только на прямых детей Холста. ItemsControl разместит контроль ContentPresenter своих прямыми детьми, так что вы можете добавить стиль для этого, а также:

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

Надеется, что это помогает

+0

Спасибо. Я нашел это решение самостоятельно около 5 минут назад. Наверное, я немного поставил вопрос. :) – atsjoo

+7

Хе-хе .. Я тоже люблю этот момент AHA;) .. И это не все плохо, хотя .. Возможно, ваш вопрос поможет другим людям тоже однажды ... Вы никогда не узнаете! – Arcturus

+0

Это действительно так, спасибо – amaca

 Смежные вопросы

  • Нет связанных вопросов^_^