Я не думаю, что модификация Grid на лету - ваш лучший выбор. Вот еще одно решение. Вы можете использовать ListBox, но замените ItemsPanel другой панелью по вашему выбору. Элемент ItemsBanel по умолчанию ListBox имеет значение VirtualizingStackPanel с ориентацией по вертикали. Поскольку вы хотите, чтобы ваши элементы отображались горизонтально, вы можете заменить его на VirtualizingStackPanel с ориентацией, установленной на Горизонтальный . Конечно, вы можете изменить ItemTemplate или что-либо еще, как считаете нужным.
<ListBox ItemsSource="{Binding MyCollection}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
Я также использовал этот метод прежде, чтобы создать ListBox, который отображает элементы по горизонтали, но переносит их на следующую строку, когда ей не хватает места на строке, используя WrapPanel. Вы также можете создавать свои собственные пользовательские панели и заменять их. Однажды я создал панель, которая выкладывала ее элементы случайным образом, и использовал ее для ListBox. Каждый элемент в моей связанной коллекции отображался в произвольной позиции в ListBox. Каждый раз, когда макет обновлялся, предметы получали новую позицию.