【问题标题】:Displaying the selected item differently in ComboBox在 ComboBox 中以不同方式显示所选项目
【发布时间】:2010-11-30 19:07:07
【问题描述】:

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

【问题讨论】:

  • 这个运气好吗?我的解决方案对您有用吗?
  • 这不是我想要的。当我选择一个项目时,关闭组合框时仍会显示详细信息。但是当我重新打开列表以找到另一个答案时,它确实隐藏了细节。这背后的想法是,当组合框显示为“作为文本框”时,我希望用户只看到第二列,但是当我打开它时,我将能够看到详细信息。如果不可能,那没关系。这是一个“很高兴拥有”的功能,而不是必需品。
  • 我已经更新了我的答案,以展示如何做你想做的事。
  • 太棒了!不过我自己也想不通。

标签: .net wpf combobox selecteditem


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

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

【讨论】:

  • 但是,这会产生一个绑定异常:Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ComboBoxItem', AncestorLevel='1''。我认为设置ItemTemplateSelector 是一种更好的方法。这是一个例子:social.msdn.microsoft.com/Forums/vstudio/en-US/…
猜你喜欢
  • 2020-10-18
  • 2010-11-07
  • 1970-01-01
  • 2020-04-24
  • 2014-03-13
  • 2011-04-19
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
相关资源
最近更新 更多