使用 HierarchicalDataTemplate 展开/折叠数据绑定的树视图项
本文关键字:视图 数据绑定 折叠 HierarchicalDataTemplate 展开 使用 | 更新日期: 2023-09-27 18:31:57
SO上有很多这种类型的问题,但都得到了解答,所以我决定创建一个快速的新问题。标题不言自明,所以这就是问题所在。树视图:
<TreeView>
<TreeView.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
<Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}" />
<Setter Property="FontWeight" Value="Normal" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="FontWeight" Value="Bold" />
</Trigger>
</Style.Triggers>
</Style>
</TreeView.Resources>
</TreeView>
分层数据模板:
var labelFactory = new FrameworkElementFactory(typeof(TextBlock));
var template = new HierarchicalDataTemplate(typeof(Node)) { ItemsSource = new Binding("Children") };
labelFactory.SetBinding(TextBlock.TextProperty, new Binding("Text"));
template.VisualTree = labelFactory;
treeView.ItemTemplate = template;
类型 i 绑定到:
public class Node
{
public List<Node> Children { get; set; }
public Node Parent { get; set; }
public bool IsSelected { get; set; }
public bool IsExpanded { get; set; }
}
实际绑定,正确显示层次结构所需的空白根:
var hierarchy = Helpers.GetHierarchy();
var rootNode = new Node();
rootNode.Children.Add(hierarchy);
GVSObjectStructureTreeView.ItemsSource = rootNode.Children;
需要以编程方式选择/展开特定项目,但是当我这样做时
var itemToSelect = FindTreeViewItem(treeView.ItemsSource as List<Node>, elementId);
itemToSelect.IsSelected = true;
什么也没发生。扩展也是如此。我想问题出在绑定上,但无法弄清楚。提前感谢您的帮助。
重写
了服务类,问题已解决。以下是我实现的两个递归层次结构帮助器(可能对其他人有用):
private static Node FindTreeViewItem(IEnumerable<Node> treeViewItems, string key)
{
if (treeViewItems == null) return null;
foreach (var item in treeViewItems)
{
if (item.AssociatedObject.ID.Equals(key))
{
return item;
}
if (item.Children != null)
{
var childItem = FindTreeViewItem(item.Children, key);
if (childItem != null)
{
return childItem;
}
}
}
return null;
}
private static void ExpandTreeViewItemParents(Node treeViewItem)
{
if (treeViewItem == null) return;
if (treeViewItem.Parent != null)
{
treeViewItem.Parent.IsExpanded = true;
}
ExpandTreeViewItemParents(treeViewItem.Parent);
}
在点击处理程序中使用如下:
var selectedItem = FindTreeViewItem(treeView.ItemsSource as List<Node>, ID);
if (selectedItem != null)
{
selectedItem.IsSelected = true;
ExpandTreeViewItemParents(selectedItem);
}
看起来你的类没有实现INotifyPropertyChanged
,所以即使绑定是正确的,也不会发生任何事情,除非你为了简洁起见省略了它。