Как сделать столбец в списке в WPF одинаковой ширины для всех элементов? - PullRequest
41 голосов
/ 09 июля 2009

У меня есть ListBox с ItemTemplate, состоящим из TextBlock и ComboBox. Проблема в том, что ширина текста внутри TextBlock не одинакова для каждого элемента, а элементы управления ComboBox не выровнены.
Как я могу установить TextBlock в шаблоне, чтобы все элементы имели одинаковую ширину, то есть одну из самых широких?

Вот мой xaml:

<ListBox MinHeight="100" ItemsSource="{Binding Trainees}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <Grid Margin="1">
        <Grid.ColumnDefinitions>
          <ColumnDefinition />
          <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <TextBlock VerticalAlignment="Center" Grid.Column="0">
          <TextBlock.Text>
            <MultiBinding StringFormat="{}{0}, {1}">
              <Binding Path="LastName" />
              <Binding Path="FirstName" />
            </MultiBinding>
          </TextBlock.Text>
        </TextBlock>
        <ComboBox HorizontalAlignment="Left" Grid.Column="1"
            ItemsSource="{Binding Source={StaticResource Functions}}" SelectedValue="{Binding Path=Function}"
            MinWidth="100" />
      </Grid>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

1 Ответ

65 голосов
/ 09 июля 2009

Вы можете использовать присоединенное свойство IsSharedSizeScope . В своем определении шаблона прикрепите «группу общего размера» к каждому столбцу, например:

<Grid.ColumnDefinitions>
    <ColumnDefinition SharedSizeGroup="col1" />
    <ColumnDefinition SharedSizeGroup="col2" />
</Grid.ColumnDefinitions>

... а затем определите ваш ListBox как область общего размера, чтобы он знал, как измерить каждую «группу размеров» одинаково:

<ListBox Grid.IsSharedSizeScope="True">...</ListBox>
...