Два варианта - а.) Не очень красиво: установить фиксированную высоту в TextBlock или б) поместить элементы в сетку следующим образом:
<ComboBox ... Grid.IsSharedSizeScope="True">
<ComboBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinistions>
<RowDefinition Height="Auto" SharedSizeGroup="Row"/>
<Grid.RowDefinistions>
<TextBlock .../>
<Grid>
<DataTemplate>
<ComboBox.ItemTemplate>
Опять же - два варианта: a) Установить фиксированную ширину TextBlock в DataTemplate. б) Если вы замените VirtualizingStackPanel на StackPanel и сделаете то же самое для ColumnDefinition выше (это будет проблемой производительности, если у вас много в вашем списке, так как при загрузке будут созданы все визуальные элементы.
Поместите VerticalAlignment = "Center" в TextBlock внутри DataTemlate.
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ:
Спасибо :). Я дам вам несколько советов:
При использовании VirtualizingStackPanel почти во всех случаях следует установить VirtualizationMode = "Recycling" - то же самое относится и к другим ItemsControls:
<ListBox VirtualizingStackPanel.VirtualiationMode="Recycling"/>
<VirtualizingStackPanel VirtualizationMode="Recycling"/>
Это перезапустит DataTemplate, когда пользователь прокручивает список. Особенно в больших наборах данных или со сложными шаблонами данных это значительно облегчает работу. IsEditable = "True" уничтожает это преимущество (это известная ошибка).
Обычно, когда вы хотите использовать только одно свойство в качестве DataTemplate, вы можете использовать DisplayMemberPath - и это даст вам ускорители клавиатуры (ввод «T» приведет к прокрутке до первого элемента, начинающегося с T и т. Д.). Если вы используете DataTemplates - вы можете достичь того же, используя TextSearch.TextPath. Просто не забудьте отсортировать элементы в выпадающем списке по тому же свойству, которое вы используете в TextPath - в противном случае пользователи получат «ухабистый» опыт, поскольку он, по-видимому, будет случайным образом перемещаться по списку.
Если вы хотите покрасить каждый второй элемент в списке - вы можете добиться этого следующим образом:
<UserControl.Resources>
<Style TargetType="{x:Type ComboBoxItem}">
<Style.Triggers>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter Property="Background" Value="LightGray"/>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<ComboBox AlternationCount="2">
На самом деле, я не очень часто использую ComboBox - в основном, я использую его для значений Enum и очень маленьких наборов данных. Проблема с ComboBox в том, что он очень плохо поддерживает подкачку страниц - для больших наборов данных я обычно использую AutoCompleteBox из WPF Toolkit или ListBox с TextBox над ним для фильтрации.
Надеюсь, у вас есть несколько подсказок: -)