在ComboBox中以不同方式显示所选项目

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在滚动时以不同的方式显示项目,而当其关闭并且只看到选择时则以不同的方式显示?


你有什么进展吗?我的解决方案对你有用吗? - Drew Noakes
这不完全是我想要的。当我选择一个项目时,即使组合框关闭,详细信息仍然会显示出来。但是当我重新打开列表以查找另一个答案时,它确实隐藏了详细信息。 这个想法是,当组合框显示为“文本框”时,我希望用户只能看到第二列,但当我打开它时,我就可以看到详细信息。 如果不可能的话没关系。这只是一个“好用”的功能,而不是必需品。 - David Brunelle
1
我已经更新了我的答案,展示了如何做你想要的事情。 - Drew Noakes
太好了!不过我自己想不出来。 - David Brunelle
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),则假定该项位于组合框区域而不是弹出窗口中

如果您以某种方式在另一个组合框的项目模板中有一个组合框,这将失败。 不过,我认为我不想使用那种UI!


然而,这会生成一个绑定异常:Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ComboBoxItem', AncestorLevel='1''。我认为设置 ItemTemplateSelector 是更好的方法。这里有一个例子:http://social.msdn.microsoft.com/Forums/vstudio/en-US/0467c9ca-efb2-4506-96e7-08ce3356860a/combobox-one-template-for-selected-item-one-for-the-dropdown-list?forum=wpf - vers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接