带扩展器的Wpf分组组合框

带扩展器的Wpf分组组合框,wpf,Wpf,我在这里找到了一个分组组合框的示例 它非常适合我使用,只是我需要一个额外的行为。所有项目都应可折叠在各自的标题下(使用扩展器) 例如。 果 苹果 橙色 葡萄 动物 猫 狗 母牛 上面的项目将显示在一个组合框中的分组样式,但我希望每个标题(这里它将是水果,动物)是可折叠的使用扩展器。你能举个例子吗 谢谢, Chev您想要的是一个组合框,而不是一个组合框。WPFTreeView本机支持此行为。下面的MSDN示例 注意:这没有您想要的下拉功能 您的代码如下所示: <TreeView Selec

我在这里找到了一个分组组合框的示例

它非常适合我使用,只是我需要一个额外的行为。所有项目都应可折叠在各自的标题下(使用扩展器)

例如。 果 苹果 橙色 葡萄 动物 猫 狗 母牛

上面的项目将显示在一个组合框中的分组样式,但我希望每个标题(这里它将是水果,动物)是可折叠的使用扩展器。你能举个例子吗

谢谢, Chev

您想要的是一个组合框,而不是一个
组合框。WPF
TreeView
本机支持此行为。下面的MSDN示例

注意:这没有您想要的下拉功能

您的代码如下所示:

<TreeView SelectedItemChanged="TreeView_SelectedItemChanged">
  <TreeViewItem Header="Fruit">
    <TreeViewItem Header="Apple"/>
    <TreeViewItem Header="Orange"/>
    <TreeViewItem Header="Grape"/>
  </TreeViewItem>
 <TreeViewItem Header="Animals">
    <TreeViewItem Header="Cat"/>
    <TreeViewItem Header="Dog"/>
    <TreeViewItem Header="Cow"/>
  </TreeViewItem>
</TreeView>

编辑:添加了额外的代码,以防止用户单击标题项,而只是折叠/扩展节点

private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    var item = e.NewValue as TreeViewItem;
    if (item == null ||item.Items.Count == 0) return;
    item.IsExpanded = !item.IsExpanded;
    item.IsSelected = false;
}
private void TreeView\u SelectedItemChanged(对象发送方,RoutedPropertyChangedEventArgs e)
{
var item=e.NewValue作为TreeViewItem;
if(item==null | | item.Items.Count==0)返回;
item.IsExpanded=!item.IsExpanded;
item.IsSelected=false;
}
编辑:这里是一个预览

试试这个

<Grid>
<Grid.Resources>
    <Style x:Key="GroupItem" TargetType="{x:Type GroupItem}">
        <Setter Property="Margin" Value="0,0,0,5"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GroupItem}">
                    <Expander IsExpanded="True">
                        <Expander.Header>
                            <DockPanel>
                                <TextBlock Text="{Binding Name}" FontWeight="Bold" Margin="2,5,0,2" FontSize="14"/>
                            </DockPanel>
                        </Expander.Header>
                        <Expander.Content>
                            <Border Margin="5,0,0,0">
                                <ItemsPresenter />
                            </Border>
                        </Expander.Content>
                    </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Grid.Resources>
<ComboBox Height="27" HorizontalAlignment="Left" Margin="162,109,0,0" VerticalAlignment="Top" Width="195" DisplayMemberPath="Item" Name="cboGroup">
    <ComboBox.GroupStyle>
        <GroupStyle ContainerStyle="{StaticResource GroupItem}"/>
    </ComboBox.GroupStyle>
</ComboBox>
</Grid>


使用树视图意味着可以选择作为父级的可展开项。而使用分组时,组头本身是不可选择的。有一个可选择的父项可能会让用户误以为是要选择的有效项。@JoelLucsy这是一个有效点,所以我现在编辑了我的示例以防止这种情况发生。这看起来仍然像是一个黑客。在MVVM系统中不是很有用。组样式确实是一种方式。@JoelLucsy,而这确实可以通过一些不太有趣的样式、触发器、绑定、转换器来实现。。。我没有走那条路。。。我想我必须创建一个自定义转换器,虽然很容易做到。。。是比上述实现更多的代码。。。。但是可以在MVVM中使用。。。短篇小说。。懒惰的