Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在组合框中以不同方式显示选定项_.net_Wpf_Combobox_Selecteditem - Fatal编程技术网

.net 在组合框中以不同方式显示选定项

.net 在组合框中以不同方式显示选定项,.net,wpf,combobox,selecteditem,.net,Wpf,Combobox,Selecteditem,我有一个组合框,在其中我设置了一个ItemTemplate,看起来像这样: <ComboBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Piece.NoPiece}" Width="50" /> <TextBlock Text="{Binding Piece.De

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

您可以使用触发器:

<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,以显示在弹出窗口折叠时如何将替代格式应用于所选项目(我不确定该区域的名称)

诀窍在于,下拉区域中的项包含在逻辑树中的
comboxItem
对象中。
RelativeSource
绑定查找该类型的对象作为祖先

  • 如果找到该项,则假定该项位于树中(并检查是否选中该项)
  • 如果未找到该项(
    null
    ),则假定该项位于组合框区域而不是弹出框中

如果您在另一个组合框的项目模板中有一个组合框,那么这将崩溃。但我不想使用这个UI

运气好吗?我的解决方案对你有用吗?这不是我想要的。当我选择一个项目时,当组合框关闭时,细节仍然显示。但当我重新打开列表寻找另一个答案时,它确实隐藏了细节。这背后的想法是,当组合框显示为“文本框”时,我希望用户只看到第二列,但当我打开它时,我将能够看到详细信息。如果不可能,也没关系。这是一个“拥有就好”的功能,不是必需的。我已经更新了我的答案,以展示如何做你想要的。太好了!但是,我自己无法解决此问题。但是,这会生成绑定异常:
无法找到引用为“RelativeSource FindAncestor,AncestorType='System.Windows.Controls.ComboBoxItem',AncestorLevel='1''的绑定源。
。我认为设置
ItemTemplateSelector
是一种更好的方法。以下是一个例子: