Вы хотите использовать ItemsControl , чтобы связать с коллекцией данных и иметь каждый кусок
данных, представленных каким-то интерфейсом. Кроме того, вы не устанавливаете привязку правильно. Давайте начнем с того, как эти две вещи могут выглядеть:
<ItemsControl ItemsSource="{Binding Path=ShapeCollection, Element=MainWindow}">
</ItemsControl>
ПРИМЕЧАНИЕ: В приведенном выше объявлении привязки предполагается, что вы применили x: Name = "MainWindow" к своему элементу Window и что ShapeCollection является свойством вне вашего класса MainWindow.
Теперь, поскольку макетом ItemsControl по умолчанию является StackPanel с вертикальной ориентацией, вы должны видеть, что ваши фигуры сложены друг над другом. Если вы хотите изменить расположение элементов, вы измените ItemPanelTemplate ItemsControl. Давайте изменим это так, чтобы формы располагались горизонтально и оборачивались по вертикали, когда заканчивается пространство:
<ItemsControl Height="100" ItemsSource="{Binding ShapeCollection, ElementName=Window, Mode=Default}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Наконец, давайте поговорим о вашем общем подходе. Прямо сейчас вы фактически используете Shapes в качестве ваших данных, что на самом деле несколько отстает от техники, известной как Mode-View-ViewModel (MVVM). В MVVM вам просто нужен чистый объект данных, а затем вы или, что еще лучше, ваш дизайнер, определяете визуальное представление этих данных с помощью DataTemplates. Для получения дополнительной информации о MVVM я предлагаю просто щелкнуть здесь тег на StackOverflow и перейти к вопросам с наибольшим количеством голосов.