По умолчанию ItemsControl
проходит по всем элементам и помещает каждый из них в StackPanel
, поэтому ваша конечная разметка в основном выглядит следующим образом:
<Canvas>
<StackPanel>
<ContentPresenter>
<Ellipse Margin="{Binding EntryPoint}" />
</ContentPresenter>
<ContentPresenter>
<Ellipse Margin="{Binding EntryPoint}" />
</ContentPresenter>
</StackPanel>
</Canvas>
Если вы хотите перебрать элементы и поместить их в Canvas
на основе некоторого связанного значения, вам нужно перезаписать ItemsPanelTemplate
, чтобы использовать Canvas
вместо StackPanel
, и применить свое позиционирование в ItemContainerStyle
, так что вы устанавливаете позиционирование на ContentPresenter
, а не на Ellipse
Это сделает ваш конечный результат похожим на:
<Canvas>
<ContentPresenter Margin="{Binding EntryPoint}">
<Ellipse />
</ContentPresenter>
<ContentPresenter Margin="{Binding EntryPoint}">
<Ellipse />
</ContentPresenter>
</Canvas>
Пример кода для достижения этой цели:
<ItemsControl ItemsSource="{Binding CurrentSegments}">
<!-- ItemsPanelTemplate -->
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<!-- ItemContainerStyle -->
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Margin" Value="{Binding EntryPoint}" />
</Style>
</ItemsControl.ItemContainerStyle>
<!-- ItemTemplate -->
<ItemsControl.ItemTemplate>
<DataTemplate>
<Ellipse Height="10" Width="10" Fill="Black" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
См. эту ссылку для некоторых образцов, использующих ItemsControl