3

我有一个组合框,我在其中设置了一个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你在向下滚动时以不同的方式显示项目,而不是在它关闭并且你只看到选择时?

4

1 回答 1

8

您可以使用触发器来做到这一点:

<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),则假定该项目位于组合框区域而不是弹出窗口中

如果您以某种方式在另一个组合框的项目模板中有一个组合框,这将分崩离析。我不认为我想使用那个用户界面!

于 2009-09-23T15:15:09.483 回答