Как правильно указывает Рэй, ListView сделает эту работу. Однако, если вы застряли и / или хотите использовать ListBox, вы также можете использовать ItemTemplate с Grid и установить свойство Grid.IsSharedSizeScope в самом ListBox. Например:
<ListBox ItemsSource="{Binding DataSource}" Grid.IsSharedSizeScope="True">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Column1"/>
<ColumnDefinition Width="Auto" SharedSizeGroup="Column2"/>
<ColumnDefinition Width="Auto" SharedSizeGroup="Column3"/>
</Grid.ColumnDefinitions>
<!-- Assumes MVVM and you wish to bind to properties and commands -->
<TextBlock Grid.Column="0" Text="{Binding ColumnOneText}"/>
<TextBlock Grid.Column="1" Text="{Binding ColumnTwoText}"/>
<TextBlock Grid.Column="2" Text="{Binding ColumnThreeText}"/>
<Button Content="ClickMe" Command="{Binding ButtonExecutionCommand}"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Это хитрый трюк, который также может быть применен к другим случаям, когда у вас есть несколько экземпляров Grid (то есть: по одному на ListBoxItem согласно этому случаю) и вы хотите совместно использовать столбец.
С уважением,