Я бы, наверное, сделал это с WrapPanel.Дайте ListBox ItemPanelTemplate с WrapPanel в нем:
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
</ItemsPanel>
</ListBox>
Затем настройте свой ItemTemplate так, чтобы размер каждого элемента составлял половину ширины самого ListBox (или такой же ширины, для вашего примера, третьегострока).Самый простой способ сделать это - установить ListBox на известную ширину, а затем привязать ширину панели верхнего уровня в DataTemplate к чему-либо в объектах элемента.Однако это означает, что объектам необходимо знать, какой ширины они должны быть - но если они хотят правильно заполнить размеры листов, возможно, это можно рассматривать как преимущество.
Другой вариант - DataTemplateSelector,но для этого также необходимо иметь способ определения, должен ли он предоставлять широкий или узкий шаблон, и у него нет доступа к информации о том, где он находится в списке - он просто знает, для какого элемента нужно доставить шаблон.
Если вы действительно хотите сделать это без того, чтобы элементы ничего не знали о том, где в списке они появятся, я думаю, вам придется отступить от ListBox и написать больше логики самостоятельно.,Возможно, вам удастся заставить ItemsControl вести себя так, но я думаю, что вам, скорее всего, придется вернуться еще дальше и сделать полноценный пользовательский элемент управления, в зависимости от того, какой гибкости вы на самом деле хотите.
Но, судя по твоему вопросу, я думаю, ты, вероятно, будешь в порядке, просто перепроверив ListBox.