如何在combobox wpf中创建嵌套项目

时间:2013-10-17 11:34:56

标签: c# wpf combobox grouping hierarchical

我在C#工作,我正在尝试找到一个创建“Hierarchical Combobox”的解决方案,因为我在互联网上搜索了几个小时,并没有发现这个问题的真正解决方案。

最接近的iv'e是使用普通的wpf组合框架使用组描述,但是,它对我来说还不够好,我无法独自前进。

我需要控制器实现的目标:

  • 每个项目都可以有子项目,如果没有子项目,则该项目可以选择,如果有子项目,则只有子项目没有递归子项目是可选择的。

  • 组合框的弹出窗口最终会显示所有缩进的项目,就像普通的树视图一样

最后,它应该是这样的:


示例:

Folder
   Selectable Item
   Folder
       Selectable Item
       Selectable Item
   Selectable Item

  • 因为你看到文件夹本身不应该是可选择的。

到目前为止,您可以在下一篇文章中看到:http://www.jarloo.com/wpf-combobox-with-groupings/

PS:我应该说我觉得这个工作看起来应该是应该在TreeView中完成的,问题是,我已经测试过了,树视图没有带有可选项的组合框逻辑等等......

TLDR:基本上我想要一个Hierarchical Combobox,组合框里面应该有一个树视图,只有非父节点可以选择。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

就像我在评论部分中所说,我看不出ComboBox在你的情况下是如何派上用场的。

以下是如何使用TreeView

实现此类操作的示例

使用MSDN Example,创建一个代表TreeView

中某个节点的类
public class Path
{
    public string Name { get; set; }
    public bool IsLeaf { get; set; }
    public ObservableCollection<Path> Children { get; set; }
}

创建一个HierarchicalDataTemplate来展示它

<HierarchicalDataTemplate x:Key="LeafTemplate" ItemsSource="{Binding Children}">
      <TextBlock FontStyle="Italic" Text="{Binding Name}"  />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="FolderTemplate" ItemsSource="{Binding Children}" ItemTemplate="{StaticResource LeafTemplate}">
      <TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>

创建一个使用它的TreeView,并拒绝对不是叶子的路径进行焦点

<TreeView Width="400"  Height="300" ItemsSource="{Binding Paths}" 
          ItemTemplate="{StaticResource FolderTemplate}" x:Name="myTreeView">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
           <Setter Property="Focusable" Value="{Binding IsLeaf}"/>
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

如果您想测试此示例,可以使用以下代码进行Paths填充

Paths = new ObservableCollection<Path>();
var p1 = new Path { Name = "Folder 1", IsLeaf = false , Children = new ObservableCollection<Path>() };
var p11 = new Path { Name = "Item 1-1", IsLeaf = true, Children = new ObservableCollection<Path>() };
var p12 = new Path { Name = "Item 1-2", IsLeaf = true, Children = new ObservableCollection<Path>() };
var p13 = new Path { Name = "Folder 1-3", IsLeaf = false, Children = new ObservableCollection<Path>() };
var p131 = new Path { Name = "Item 1-3-1", IsLeaf = true, Children = new ObservableCollection<Path>() };

// Build path's
p13.Children.Add(p131);
p1.Children.Add(p11);
p1.Children.Add(p12);
p1.Children.Add(p13);
Paths.Add(p1);

你可以随意控制他的可见性并随时出现,例如点击一个按钮时,例如:

        <ToggleButton Content="Select Item" x:Name="treeViewVisible"/>
        <TreeView Width="400"  Height="300" ItemsSource="{Binding Paths}"
                  Visibility="{Binding ElementName=treeViewVisible, Path=IsChecked, Converter={StaticResource boolToVisibilityConverter}}" .... />

希望这有帮助