如何在组合框 wpf 中制作嵌套项
本文关键字:嵌套 wpf 组合 | 更新日期: 2023-09-27 18:35:49
我用C#工作,我正在尝试找到创建"分层组合框"的解决方案,因为iv'e在互联网上搜索了几个小时,没有找到这个问题的真正解决方案。
最接近的iv'e是使用组描述使用普通的wpf组合框,但是,它对我来说仍然不够好,我自己也无处可去。
我需要控制器来实现的事情:
- 每个项目可以有子项目,如果没有子项目,
则可以选择该项目,如果有子项目,则只有没有递归子项目的子项目是可递归的。
组合框的弹出窗口最终将显示缩进的所有项目,就像普通树视图一样
最后,它应该看起来像这样:
例:
Folder
Selectable Item
Folder
Selectable Item
Selectable Item
Selectable Item
- 如您所见,文件夹本身不应该是可选的。
到目前为止,您可以在下一篇文章中看到:http://www.jarloo.com/wpf-combobox-with-groupings/
PS:我应该说我意识到这项工作看起来应该在 TreeView 中完成,问题是,我已经测试过了,树视图没有带有可选项目的组合框逻辑,等等......
TLDR:基本上我想要一个分层组合框,该组合框内部应该有一个树视图,只有非父节点可以选择。
有什么想法吗?
就像我在评论部分说的,我不明白ComboBox
在您的情况下如何方便。
下面是如何使用TreeView
实现此类目标的示例
使用 MSDN 示例,创建一个表示TreeView
中的节点的类
public class Path
{
public string Name { get; set; }
public bool IsLeaf { get; set; }
public ObservableCollection<Path> Children { get; set; }
}
创建分层数据模板以呈现它
<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}}" .... />
希望这有帮助