【问题标题】:How do I make nested items in combobox wpf如何在组合框 wpf 中制作嵌套项目
【发布时间】:2013-10-25 21:04:45
【问题描述】:

我在 C# 中工作,我正在尝试找到创建“分层组合框”的解决方案,因为我在互联网上搜索了几个小时,但没有找到真正解决这个问题的方法。

我所达到的最接近的是使用组描述的普通 wpf 组合框,但是,这对我来说还不够好,而且我没有自己前进的地方。

我需要控制器来实现的事情:

  • 每个item可以有子item,如果没有子item可以选择item,如果有子item,递归只有没有子item的子item是可选择的。

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

最后应该是这样的:


示例:

Folder
   Selectable Item
   Folder
       Selectable Item
       Selectable Item
   Selectable Item

  • 如您所见,文件夹本身不应该是可选择的。

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

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

TLDR:基本上我想要一个分层组合框,该组合框内部应该有一个树视图,只有非父节点可选。

有什么想法吗?

【问题讨论】:

  • 不确定我是否理解..您希望“树”中的每个节点都称为ComboBox?那个 ComboBox 会显示什么?
  • 基本上我想要一个层次组合框,那个组合框里面应该有一个树视图,只有非父节点可选。
  • 我还是不明白你为什么坚持使用 ComboBox。听起来像是经典的TreeView,用户只能选择叶子。您可以让 TreeView 出现在按钮单击或其他一些操作上,以避免一直显示它,但对我来说它仍然不像 ComboBox ...
  • 如果我可以问,你会如何设计这样的 TreeView?

标签: c# wpf combobox grouping hierarchical


【解决方案1】:

就像我在评论部分所说的那样,我看不出ComboBox 在你的情况下有多方便。

这是一个如何使用TreeView实现这样的事情的例子

使用MSDN Example,创建一个代表TreeView中的节点的类

public class Path
{
    public string Name { get; set; }
    public bool IsLeaf { get; set; }
    public ObservableCollection<Path> Children { get; set; }
}

创建一个HierarchicalDataTemplates 来展示它

<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}}" .... />

希望对你有帮助

【讨论】:

  • 谢谢,会尝试使用它并会报告。
猜你喜欢
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多