treeview 相关问题

TreeView控件用于显示分层信息。

JDK 8 TreeView 披露三角形垂直对齐不正确

我制作了一个高度为 40 px 的自定义树单元。 这里的问题披露三角形没有垂直居中对齐。 这里是树单元的代码: 公共静态类 TestObjectCell 扩展

回答 4 投票 0

使用 Tkinter Treeview 项目的 ID 获取其文本

我想在双击时获取树视图项 subdir3 的显示文本。我知道“文本”不正确,因为 print tree.set('subdir3') 打印列和值的字典以及“文本”...

回答 1 投票 0

Python tkinter 树视图没有按预期缩小

我在左侧的框架中有一个树视图元素,它与右侧的另一个元素共享空间,在这个测试用例中,它是一个按钮。当窗口大小调整为较小尺寸时,

回答 1 投票 0

带复选框的 C# MVVM WPF TreeView 不填充

我的问题是,当我尝试动态创建带有复选框的 TreeView 时,但 TreeView 是空的。 经过一番研究后我尝试了这个: 这是我的 XAML 树视图 我的问题是,当我尝试动态创建带有复选框的 TreeView 时,但 TreeView 是空的。 经过一些研究,我尝试了这个: 这是我在 XAML 中的树视图 <TreeView x:Name="TrwDonneesXml" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Row="8" Grid.Column="0" Height="420" Width="500" Margin="10,10,10,10" Background="LightGray" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" ItemsSource="{Binding Root, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="True"> <TreeView.Resources> <HierarchicalDataTemplate DataType="{x:Type models:CheckableItem}" ItemsSource="{Binding Childrens, Mode=TwoWay}"> <StackPanel Orientation="Horizontal" > <!--These elements are bound to a CheckableItem object.--> <CheckBox Focusable="False" Content="{Binding Name}" IsChecked="{Binding IsChecked, Mode=TwoWay}" VerticalAlignment="Center"/> <!--<TextBlock Text="{Binding Name}" Margin="2,0"/>--> </StackPanel> </HierarchicalDataTemplate> </TreeView.Resources> </TreeView> 这是我的视图模型 namespace AsurEnvironnement.SynchronisationModule.ViewModels { public class Synchronisation2UserControlViewModel : ViewModelBase { [...] public ObservableCollection<CheckableItem> Root = new ObservableCollection<CheckableItem>(); ObservableCollection<CheckableItem> rootAChildrens = new ObservableCollection<CheckableItem>(); [...] public override async Task InitializeStepAsync() { try { ObservableCollection<CheckableItem> rootAChildrens = new ObservableCollection<CheckableItem>(); ObservableCollection<CheckableItem> rootBChildrens = new ObservableCollection<CheckableItem>(); CheckableItem rootA = new CheckableItem() { Name = "RootA" }; CheckableItem childrenA1 = new CheckableItem() { Name = "ChildrenA1" }; CheckableItem childrenA2 = new CheckableItem() { Name = "ChildrenA2" }; rootAChildrens.Add(childrenA1); rootAChildrens.Add(childrenA2); rootA.Childrens = rootAChildrens; CheckableItem rootB = new CheckableItem() { Name = "RootB" }; CheckableItem childrenB1 = new CheckableItem() { Name = "ChildrenB1" }; rootBChildrens.Add(childrenB1); rootB.Childrens = rootBChildrens; CheckableItem rootC = new CheckableItem() { Name = "RootC" }; Root.Add(rootA); Root.Add(rootB); Root.Add(rootC); [...] } catch (Exception ex) { ProcessSnackBar(ex.Message); _logger.LogError(ex.Message, ex); } finally { [...] } } [...] } 这是我的模型 namespace AsurEnvironnement.SynchronisationModule.Models { public class CheckableItem : DataModelBase, INotifyPropertyChanged { private bool? _isChecked; public ObservableCollection<CheckableItem> Childrens; public bool? IsChecked { get { return _isChecked; } set { _isChecked = value; foreach(CheckableItem children in Childrens) { children.IsChecked = true; } } } public string Name { get; set; } } } 我尝试使用 Console.WriteLine(TrwDonneesXml.HasItems); 检查数据是否存在但看不到,但结果为 false,因此我在调试模式下检查了 TrwDonneesXml.ItemsSource 为 null。 但我真的不明白为什么。 由于您的语义错误,TreeView 为空,导致 TreeView.ItemsSource 绑定失败。 这是一个字段: public ObservableCollection<CheckableItem> Root; 这是一处房产: public ObservableCollection<CheckableItem> Root { get; set; } 您基本上是使用字段初始值设定项初始化公共字段: public ObservableCollection<CheckableItem> Root = new ObservableCollection<CheckableItem>(); 但是,在 WPF 中,您只能绑定到公共属性,而不能绑定到字段。 正确的定义必须是: public ObservableCollection<CheckableItem> Root { get; } = new ObservableCollection<CheckableItem>();

回答 1 投票 0

使用文件系统目录结构填充 TreeView

我是这里的节点新手..:)我想出了这个算法,但它只显示父节点列表..像这样.. A a.txt 乙 C C 米 n 乙 哦 p ETC... 我希望下一个节点将...

回答 2 投票 0

WPF - 更改树视图选择颜色

我有兴趣更改所有树视图所选项目的背景和前景 查看此页面以供参考 https://learn.microsoft.com/en-us/dotnet/desktop/wpf/controls/treeview-sty...

回答 1 投票 0

如何从HierarchicalDataTemplate项目中获取TreeViewItem?

我有一个 TreeView,它使用 HierarchicalDataTemplate 来绑定其数据。 它看起来像这样: 我有一个 TreeView,它使用 HierarchicalDataTemplate 来绑定其数据。 看起来像这样: <TreeView x:Name="mainTreeList" ItemsSource="{Binding MyCollection}> <TreeView.Resources> <HierarchicalDataTemplate DataType="{x:Type local:MyTreeViewItemViewModel}" ItemsSource="{Binding Children}"> <!-- code code code --> </HierarchicalDataTemplate> </TreeView.Resources> </TreeView> 现在,从主窗口的代码隐藏中,我想获取当前选定的TreeViewItem。但是,如果我使用: this.mainTreeList.SelectedItem; selectedItem 的类型为 MyTreeViewItemViewModel。但我想得到“父母”或“绑定”TreeViewItem。我不会将其传递给我的 TreeViewItemModel 对象(甚至不知道如何传递)。 我该怎么做? TreeViewItem item = (TreeViewItem)(mainTreeList .ItemContainerGenerator .ContainerFromIndex(mainTreeList.Items.CurrentPosition)); 不起作用(对我来说),因为使用 HierarchicalDataTemplate 的树视图中的 mainTreeList.Items.CurrentPosition 将始终为 -1。 也没有,因为使用 HierarchicalDataTemplate 的树视图中的 mainTreeList.Items.CurrentItem 将始终为 null。 TreeViewItem item = (TreeViewItem)mainTreeList .ItemContainerGenerator .ContainerFromItem(mainTreeList.Items.CurrentItem); INSTEAD 我必须在路由的 TreeViewItem.Selected 事件中设置最后选定的 TreeViewItem,该事件会冒泡到树视图(TreeViewItem 本身在设计时不存在,因为我们使用的是 HierarchicalDataTemplate)。 可以在 XAML 中捕获事件,如下所示: <TreeView TreeViewItem.Selected="TreeViewItemSelected" .../> 然后可以在事件中设置最后选择的 TreeViewItem,如下所示: private void TreeViewItemSelected(object sender, RoutedEventArgs e) { TreeViewItem tvi = e.OriginalSource as TreeViewItem; // set the last tree view item selected variable which may be used elsewhere as there is no other way I have found to obtain the TreeViewItem container (may be null) this.lastSelectedTreeViewItem = tvi; ... } 来自 Bea Stollnitz 关于此的博客条目,请尝试 TreeViewItem item = (TreeViewItem)(mainTreeList .ItemContainerGenerator .ContainerFromIndex(mainTreeList.Items.CurrentPosition)); 我遇到了同样的问题。 我需要访问 TreeViewItem 以便选择它。 然后我意识到我可以将属性 IsSelected 添加到我的 ViewModel,然后将其绑定到 TreeViewItems IsSelectedProperty。 这可以通过 ItemContainerStyle 来实现: <TreeView> <TreeView.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/> <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> </Style> </TreeView.ItemContainerStyle> </TreeView> 现在,如果我想选择树视图中的某个项目,我只需直接在 ViewModel 类上调用 IsSelected 即可。 希望它对某人有帮助。 TreeViewItem item = (TreeViewItem)(mainTreeList .ItemContainerGenerator .ContainerFromIndex(mainTreeList.Items.CurrentPosition)); gives first item in the TreeView because CurrentPosition is always 0. 怎么样 TreeViewItem item = (TreeViewItem)(mainTreeList .ItemContainerGenerator .ContainerFromItem(mainTreeList.SelectedItem))); 这对我来说效果更好。 受 Fëanor 答案的启发,我尝试让已创建 TreeViewItem 的每个数据项都可以轻松访问 TreeViewItem。 这个想法是向视图模型添加一个 TreeViewItem 类型的字段,也通过接口公开,并且每当创建 TreeView 容器时让 TreeViewItem 自动填充它。 这是通过子类化 TreeView 并将事件附加到 ItemContainerGenerator 来完成的,每当创建 TreeViewItem 时都会记录它。问题包括 TreeViewItem 是懒惰创建的,因此在某些时间可能真的没有可用的。 自从发布这个答案以来,我进一步开发了它并在一个项目中使用了很长时间。到目前为止没有任何问题,除了这违反了 MVVM(但也为您节省了大量简单案例的样板文件)。来源这里。 用法 选择所选项目的父项并将其折叠,确保它位于视图中: ... var selected = myTreeView.SelectedItem as MyItem; selected.Parent.TreeViewItem.IsSelected = true; selected.Parent.TreeViewItem.IsExpanded = false; selected.Parent.TreeViewItem.BringIntoView(); ... 声明: <Window ... xmlns:tvi="clr-namespace:TreeViewItems" ...> ... <tvi:TreeViewWithItem x:Name="myTreeView"> <HierarchicalDataTemplate DataType = "{x:Type src:MyItem}" ItemsSource = "{Binding Children}"> <TextBlock Text="{Binding Path=Name}"/> </HierarchicalDataTemplate> </tvi:TreeViewWithItem> ... </Window> class MyItem : IHasTreeViewItem { public string Name { get; set; } public ObservableCollection<MyItem> Children { get; set; } public MyItem Parent; public TreeViewItem TreeViewItem { get; set; } ... } 代码 public class TreeViewWithItem : TreeView { public TreeViewWithItem() { ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged; } private void ItemContainerGenerator_StatusChanged(object sender, EventArgs e) { var generator = sender as ItemContainerGenerator; if (generator.Status == GeneratorStatus.ContainersGenerated) { int i = 0; while (true) { var container = generator.ContainerFromIndex(i); if (container == null) break; var tvi = container as TreeViewItem; if (tvi != null) tvi.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged; var item = generator.ItemFromContainer(container) as IHasTreeViewItem; if (item != null) item.TreeViewItem = tvi; i++; } } } } interface IHasTreeViewItem { TreeViewItem TreeViewItem { get; set; } } 尝试这样的事情: public bool UpdateSelectedTreeViewItem(PropertyNode dateItem, ItemsControl itemsControl) { if (itemsControl == null || itemsControl.Items == null || itemsControl.Items.Count == 0) { return false; } foreach (var item in itemsControl.Items.Cast<PropertyNode>()) { var treeViewItem = itemsControl.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem; if (treeViewItem == null) { continue; } if (item == dateItem) { treeViewItem.IsSelected = true; return true; } if (treeViewItem.Items.Count > 0 && UpdateSelectedTreeViewItem(dateItem, treeViewItem)) { return true; } } return false; } 我将 William 的递归搜索修改为更紧凑的版本: public TreeViewItem GetTreeViewItemFromObject(ItemContainerGenerator container, object targetObject) { if (container.ContainerFromItem(targetObject) is TreeViewItem target) return target; for (int i = 0; i < container.Items.Count; i++) if ((container.ContainerFromIndex(i) as TreeViewItem)?.ItemContainerGenerator is ItemContainerGenerator childContainer) if (GetTreeViewItemFromObject(childContainer, targetObject) is TreeViewItem childTarget) return childTarget; return null; } 可以通过提供 TreeView 实例的 ItemContainerGenerator 和目标数据对象来调用它: TreeViewItem tvi = GetTreeViewItemFromObject(treeView.ItemContainerGenerator, targetDataObject); 单个 ItemContainerGenerator.ContainerFromItem 或 ItemContainerGenerator.ItemContainerGenerator 调用无法找到与树视图对象关联的 TreeViewItem,因为树视图项控制器和树视图项数据是分离的。 需要创建一个递归函数来使用 ItemContainerGenerator.ContainerFromItem 和 ItemContainerGenerator.ItemContainerGenerator,以便在树视图中定位 TreeViewItem。 示例递归函数可能如下所示: private TreeViewItem GetTreeViewItemFromObject(ItemContainerGenerator container, object tvio) { var item = container.ContainerFromItem(tvio) as TreeViewItem; if (item != null) { return item; } for (int i = 0; i < container.Items.Count; i++) { var subContainer = (TreeViewItem)container.ContainerFromIndex(i); if (subContainer != null) { item = GetTreeViewItemFromObject(subContainer.ItemContainerGenerator, tvio); if (item != null) { return item; } } } return null; } 呼叫者 var target = GetTreeViewItemFromObject(treeView.ItemContainerGenerator, item); 递归函数仅在树视图的 ItemContainerGenerator.Status 为 ContainersGenerated 后才起作用。所以在初始化视图期间,GetTreeViewItemFromObject不起作用。 您是否需要 TreeViewItem 因为您要修改正在显示的内容?如果是这种情况,我建议使用 Style 来更改项目的显示方式,而不是使用代码隐藏,而不是直接修改 TreeViewItem。希望它会更干净。 如果您必须在孩子的孩子中查找项目,您可能必须使用像这样的递归 public bool Select(TreeViewItem item, object select) // recursive function to set item selection in treeview { if (item == null) return false; TreeViewItem child = item.ItemContainerGenerator.ContainerFromItem(select) as TreeViewItem; if (child != null) { child.IsSelected = true; return true; } foreach (object c in item.Items) { bool result = Select(item.ItemContainerGenerator.ContainerFromItem(c) as TreeViewItem, select); if (result == true) return true; } return false; } 这是解决方案。 rtvEsa 是树视图。 HierarchicalDataTemplate 是树视图模板 标签使当前项目真正消耗。这不是选定的项目,它是使用 HierarchicalDataTemplate 的树控件中的当前项目。 Items.CurrentItem 是内部树集合的一部分。 您无法获得许多不同的数据。例如 Items.ParenItem 也是如此。 <HierarchicalDataTemplate ItemsSource="{Binding ChildItems}"> <TextBox Tag="{Binding ElementName=rtvEsa, Path=Items.CurrentItem }" /> 我的 TreeView 模板只有一级标题,所以我发现成功了: foreach (CollectionViewGroup grp in treeView.Items) { string strHeader = (string)grp.Name; TreeViewItem treeViewItem = (TreeViewItem)treeView.ItemContainerGenerator.ContainerFromItem(grp);

回答 12 投票 0

Python Tkinter Treeview:行着色

我已经在 Tkinter Python 中创建了一个树视图表,到目前为止只用一项填充了它。该项目对应于表的第一行。该行的颜色设置为绿色。当赛...

回答 1 投票 0

如何让 KP_Down、KP_Up、KP_Next、KP_Prior 滚动 `ttk.Treeview` 小部件,如 KeyPress-Down、KeyPress-Up、KeyPress-Next、KeyPress-Prior?

我发现在 tkinter 中,''、''、''、'' 不会将 ttk.Treeview 小部件滚动为 ''、''、'<

回答 1 投票 0

Tkinter 中的绑定函数问题

我报告了我的代码的简化可运行版本,我正在尝试绑定到我的 Treeview 以对其执行操作。 我的问题如下: onSingleClick 函数并不总是触发...

回答 1 投票 0

如何为列表创建树形视图<List<int>?

我有一个 EntityDisplay 类,其中包含 2 个属性: 公共密封类 EntityDisplayObject { 公共 ICollection 集合 { 获取;私人套装; } 公共字符串集合名称{获取;

回答 1 投票 0

如何在GTK3中进行拖放

我想知道如何在 GTK3 中拖放。这里的代码适用于 GTK2,在 GTK3 中不起作用。编译器抱怨 onDragDataReceived 中的 seldata 中没有数据元素。还有...

回答 2 投票 0

如何用tkinter解决python中treeview出父框架的问题?

我想加载并修改Excel工作表的内容。我正在使用 tkinter treeview 通过 openpyxl 显示数据。 问题是每当我打开大于框架尺寸的 Excel 工作表时,...

回答 1 投票 0

将树视图显示为数据库源中的文件夹资源管理器

我的树视图有任何问题。客户需要将根文件夹添加到他的文件管理器中。我尝试使用树视图从他的数据库中填充树。这是他的数据库的一部分: db e...

回答 1 投票 0

向 MUI 树视图添加连接边框

我想添加一些连接到 mui 树视图中的节点的边框,但我一直在努力解决一个部分,即当它是最后一个叶节点时没有垂直边框 是

回答 1 投票 0

删除或隐藏分层TreeView中的根节点

我有一个像这样的TreeView: ...

回答 2 投票 0

数组树上的JS过滤器

我想过滤我的数组树并仅显示基于标签的已找到节点 这是我的代码的输出: 在此输入图像描述 我添加了输入搜索,当我输入时我更新...

回答 1 投票 0

TreeView 和 TreeNode,ImageList 中的图像并不总是显示

我有一个 TreeView,并且我已将 ImageList 分配给 TreeView: mlstImg.Images.Add(Resources.EMPTY); mlstImg.Images.Add(资源.MIXED); mlstImg.Images.Add(资源.DOWN); mlstImg.Images....

回答 1 投票 0

如何混合两种RGB颜色?

我有一个 C# 应用程序,其中有多个位置,每个位置都有多个节点。我对每个位置进行 ping 操作,如果有响应,则显示为绿色,绿色的深浅取决于响应时间...

回答 1 投票 0

Javafx TreeView 奇怪的选择行为

我尽量注意通过鼠标单击或按键选择 TreeView 项目的用户不会选择容器项目。按箭头键只能在叶项上上下移动。一只老鼠...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.