Давайте посмотрим ...
Поместите ObservableCollection в виртуальную машину, затем ...
Опция 1:
... простая Сетка в V. Подписатьсяк его событию CollectionChanged из xaml.cs, добавьте ContentControls для каждого добавленного объекта в сетку, свяжите свойства ContentControl Grid.Row и Grid.Column со свойствами каждого объекта и установите DataContext для самого объекта, а ContentTemplate для Resources ["MyTemplate"].(Кроме того, для всех удаленных объектов найдите соответствующий ContentControl и удалите его.)
Pro: easy
Con: .cs, без поддержки дизайнера
Опция 2:
... ItemsControl в V. Установите его ItemPanelTemplate в Grid и привяжите вашу ObservableCollection к его ItemsSource.Затем установите ваш Itemtemplate на MyTemplate.Теперь уловка состоит в том, чтобы поместить элементы в правильную ячейку, основываясь на ваших значениях.Для этого используйте свойство ItemControl ItemContainerStyle и свяжите Grid.Row и Column контейнера с этими свойствами.
Pro: хороший xaml и легко расширяемый
Con: ItemContainerStyle сложен в WPF и отсутствует в Silverlight, так что в случаео последнем вы можете забыть
Вариант 3:
... настраиваемая панель, которую вы пишете.Унаследовать это от Grid возможно.Затем, если в него вставлен элемент, проверьте, реализует ли его DataContext интерфейс, содержащий ваши свойства.Затем используйте это как ItemsPanel в Варианте 2 ...
Pro: он должен отлично работать
Con: Вы должны написать новую Panel для этого ...
Надеюсь, один из этих 3 будетбудет хорошо для тебя.