2009-09-23 144 views
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> 

正如你所看到的,我有三列,让用户看到不同一点信息。但是,我希望组合中的选定项目仅显示第二列。换句话说,有没有一种方法可以使您在向下滚动时以及在关闭时显示项目的方式显示项目,并且您只能看到选择内容?

+0

对此有什么好运?我的解决方案适合你吗? – 2009-09-23 16:14:47

+0

这不完全是我要找的。当我选择一个项目时,当组合框关闭时,细节仍然显示。但是,当我重新打开列表以找到另一个答案时,它确实隐藏了详细信息。 这个背后的想法是,我希望用户只有在组合框显示为“文本框”时才会看到第二列,但是当我打开它时,我将能够看到详细信息。 如果这是不可能的,那就OK了。这是一个'很高兴'的功能,而不是必需品。 – 2009-09-23 19:10:56

+1

我已经更新了我的答案,以显示如何做你想做的。 – 2009-09-24 09:28:53

回答

7

你可以用触发器做:

<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),那么它假设该项目是在组合框中面积,而不是弹出式菜单

如果你在另一个组合框的项目模板中有一个组合框,它会崩溃。我不认为我想要使用那个用户界面!

+0

但是,这会产生一个绑定异常:'无法找到与引用绑定的源'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-se- selected-item-one-for -the-下拉列表?论坛= WPF – 2014-05-02 20:30:09