Отображение выбранного элемента по-разному в ComboBox

У меня есть поле со списком, в котором я настроил ItemTemplate это выглядит примерно так:

<ComboBox.ItemTemplate>
  <DataTemplate>
    <StackPanel Orientation="Horizontal">
      <TextBlock Text="{Binding Piece.NoPiece}" Width="50" />
      <TextBlock Text="{Binding Piece.Description}" Width="170" />
      <TextBlock Text="{Binding Piece.Categorie.NomCategorie}" />
    </StackPanel>
  </DataTemplate>
</ComboBox.ItemTemplate>

Как видите, у меня есть три столбца, которые позволяют пользователю видеть различную информацию. Тем не менее, я хотел бы, чтобы выбранный элемент в комбинированном отображении отображал только второй столбец. Другими словами, есть ли способ иметь ItemTemplate что отображает элементы по-разному, когда вы прокручиваете страницу вниз по сравнению с закрытой, и вы видите только выбор?

1 ответ

Решение

Вы можете сделать это с помощью триггеров:

<ComboBox.ItemTemplate>
  <DataTemplate>
    <StackPanel Orientation="Horizontal">
      <TextBlock Text="{Binding Piece.NoPiece}" Width="50" x:Name="Column1" />
      <TextBlock Text="{Binding Piece.Description}" Width="170" />
      <TextBlock Text="{Binding Piece.Categorie.NomCategorie}" x:Name="Column3" />
    </StackPanel>
    <DataTemplate.Triggers>
      <!-- This trigger fires for the selected item in the drop-down list -->
      <DataTrigger Binding="{Binding 
                       RelativeSource={RelativeSource Mode=FindAncestor, 
                                                      AncestorType=ComboBoxItem},
                       Path=IsSelected}" 
        Value="True">
        <Setter TargetName="Column1" Property="Visibility" Value="Hidden" />
        <Setter TargetName="Column3" Property="Visibility" Value="Hidden" />
      </DataTrigger>

      <!-- This trigger fires for the selected item (ie the one that's
           visible when the popup is closed -->
      <DataTrigger Binding="{Binding 
                       RelativeSource={RelativeSource Mode=FindAncestor, 
                                                      AncestorType=ComboBoxItem}}"
                   Value="{x:Null}">
        <Setter TargetName="Column1" Property="Visibility" Value="Hidden" />
        <Setter TargetName="Column3" Property="Visibility" Value="Hidden" />
      </DataTrigger>
    </DataTemplate.Triggers>
  </DataTemplate>
</ComboBox.ItemTemplate>

РЕДАКТИРОВАТЬ

Я обновил XAML, чтобы показать, как применить альтернативное форматирование к выбранному элементу, когда всплывающее окно свернуто (я не уверен, как называется эта область).

Хитрость заключается в том, что элементы в раскрывающемся списке содержатся внутри ComboBoxItem объекты в логическом дереве. RelativeSource Привязка ищет объект этого типа в качестве предка.

  • Если он находит его, он предполагает, что элемент находится в дереве (и проверяет, выбран ли он)
  • Если это не найдено (null) тогда предполагается, что элемент находится в поле со списком, а не во всплывающем окне

Это развалилось бы, если бы у вас каким-то образом было поле со списком в шаблоне элемента другого поля со списком. Я не думаю, что хотел бы использовать этот интерфейс, хотя!

Другие вопросы по тегам