WPF TreeView自定义数据模板展开到指定层
来源:互联网 发布:数据正态分布说明什么 编辑:程序博客网 时间:2024/06/03 20:28
TreeView 全部展开还是挺方便的只需设置TreeViewItem 样式即可全部展开,但展开到具体某一级就需要手工代码实现。如果TreeView 没有自定义数据模板 节点继承TreeViewItem 那么树的展开可以参考 MSDN博客 点击打开链接
public static class ExtensionMethods{ public static void ExpandAll(this System.Windows.Controls.TreeView treeView) { ExpandInternal(treeView); }
private static void ExpandInternal(ItemsControl targetItemContainer){ if (targetItemContainer == null) return; if (targetItemContainer.Items == null) return; for (int i = 0; i < targetItemContainer.Items.Count; i++) { TreeViewItem treeItem = targetItemContainer.Items[i] as TreeViewItem; if (treeItem == null) continue; if (!treeItem.HasItems) continue; treeItem.IsExpanded = true; ExpandInternal(treeItem); } }}
一、设置样式全部展开
<UserControl.Resources> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="IsExpanded" Value="True" /> <!-- 设置IsExpanded 为True 即全部展开--> </Style> </UserControl.Resources> <DockPanel LastChildFill="True"> <TreeView x:Name="treeView1" x:FieldModifier="private" BorderBrush="{x:Null}"> <TreeView.ItemTemplate> <HierarchicalDataTemplate DataType="{x:Type local:CompanyNodeItem}" ItemsSource="{Binding Children}" > <TextBlock VerticalAlignment="Center" Text="{Binding CompanyName}" TextWrapping="Wrap" MaxWidth="200" /> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView> </DockPanel>
二、利用绑定机制实现展开到具体某一级
<TreeView x:Name="treeView1" x:FieldModifier="private" BorderBrush="{x:Null}"> <TreeView.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="IsExpanded" Value="{Binding Expand}" /> <!--是否展开绑定Expand 属性 后台代码设置Expand true false 即可展开到某一级--> </Style> </TreeView.ItemContainerStyle> <TreeView.ItemTemplate> <HierarchicalDataTemplate DataType="{x:Type local:CompanyNodeItem}" ItemsSource="{Binding Children}" > <TextBlock VerticalAlignment="Center" Text="{Binding CompanyName}" TextWrapping="Wrap" MaxWidth="200" /> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView>
节点对象
public class CompanyNodeItem { public int CompanyId { set; get; } public string CompanyName { set; get; } public int ParentId { set; get; } public List<CompanyNodeItem> Children { set; get; } public bool Expand { set; get; } public CompanyNodeItem() { Children = new List<CompanyNodeItem>(); } }
/// <summary> /// 展开树节点到某一级 递归算法 /// <param name="list">构建树的所有节点集合</param> /// <param name="lev"></param> private void ExpandInternal(List<CompanyNodeItem> list, int lev) { if (lev > 3) //展开到第三层 return; list.ForEach(s => ExpandInternal(s.Children, lev + 1)); list.ForEach(s=>s.Expand=true); }
完整后台代码包括树的创建:
public partial class WPFCompanyTree : UserControl { private List<CompanyNodeItem> listNode; /// <summary> /// WPFCompanyTree 选择的列改变引发的事件 /// </summary> public event Action<object, CompanyNodeItem> WPFCompanyTreeSelectedItemChanged; private List<CompanyNodeItem> listExpandNode; public WPFCompanyTree() { InitializeComponent(); this.treeView1.SelectedItemChanged += treeView1_SelectedItemChanged; InitDbData(); listExpandNode = InitTreeData(); treeView1.ItemsSource = listExpandNode; ExpandInternal(listExpandNode, 1); } void treeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) { if (WPFCompanyTreeSelectedItemChanged != null) WPFCompanyTreeSelectedItemChanged(sender, treeView1.SelectedItem as CompanyNodeItem); } private void InitDbData() { DataTable dt = SqlClass.GetTable(@"SELECT [CID] ,[CName] ,[CParentID] FROM [jq.666gps.com].[dbo].[XFJCompany]"); int count = dt.Rows.Count; listNode = new List<CompanyNodeItem>(); for (int i = 0; i < count; i++) { listNode.Add(new CompanyNodeItem() { CompanyId = Convert.ToInt32(dt.Rows[i][0]), CompanyName = dt.Rows[i][1].ToString(), ParentId = Convert.ToInt32(dt.Rows[i][2]) }); } } private List<CompanyNodeItem> InitTreeData() { List<CompanyNodeItem> nodes = new List<CompanyNodeItem>(); listNode.ForEach(s => { if (s.ParentId == 0) { nodes.Add(s); } else { CompanyNodeItem temp = NextFindNode(listNode, s.ParentId); if (temp != null) { temp.Children.Add(s); } } }); return nodes; } private CompanyNodeItem NextFindNode(List<CompanyNodeItem> list, int id) { if (list == null) return null; foreach (CompanyNodeItem node in list) { if (node.CompanyId == id) return node; CompanyNodeItem temp = NextFindNode(node.Children, id); if (temp != null) return temp; } return null; } /// <summary> /// 展开树节点到某一级 /// </summary> /// <param name="list">构建树的所有节点集合</param> /// <param name="lev"></param> private void ExpandInternal(List<CompanyNodeItem> list, int lev) { if (lev > 3) //展开到第三层 return; list.ForEach(s => ExpandInternal(s.Children, lev + 1)); list.ForEach(s=>s.Expand=true); } }
- WPF TreeView自定义数据模板展开到指定层
- treeview展开指定层的结点
- treeview展开指定层的结点
- WPF TreeView如何展开到某个节点
- WPF TreeView如何展开到某个节点
- WPF TreeView如何展开到某个节点
- EXT:指定树控件TreePanel 展开到第几层
- WPF(小结4)TreeView的数据分层模板
- WPF TreeView 展开和闭合所有节点
- WPF TreeView节点的展开和收缩
- TreeView 展开时填充数据
- WPF新手之如何将数据绑定到TreeView
- WPF的ComboBox 数据模板自定义
- [老贴重发]EXT:指定树控件TreePanel 展开到第几层
- WPF中展开一个TreeView控件的所有树节点
- WPF中展开一个TreeView控件的所有树节点
- WPF中展开一个TreeView控件的所有树节点
- WPF中展开一个TreeView控件的所有树节点
- 百度地图Api进阶教程-弹出信息窗口5.html
- OOM
- AppScan安全漏洞报告
- mysql 数据库导入\导出(总结备忘)
- Qt开发的程序添加ico图标
- WPF TreeView自定义数据模板展开到指定层
- MMS
- [数组][查表][折半查找]-Java第4天课程
- mybatis基于annotation的方式取得自增长ID值
- My_PC
- TinyXML:一个优秀的C++ XML解析器
- [STL基础]线性表vector之用法
- 排序
- vim 用指定编码保存文件