WPF TreeView自定义数据模板展开到指定层
2013-01-06 02:48
387 查看
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 数据模板DataType属性的使用,不用指定ItemTemplate
- WPF的ComboBox 数据模板自定义
- WPF 自定义列表筛选 自定义TreeView模板 自定义ListBox模板
- WPF的ComboBox 数据模板自定义
- WPF(小结4)TreeView的数据分层模板
- WPF-模板概述(数据模板)
- WPF自定义TreeView显示结构通用类
- windbg 学习----#(从反汇编中搜索符合指定模板的数据)
- WPF 自定义的图表(适用大量数据绘制)下
- thinphp 自定义标签,非常方便在模板读取数据。
- .Net 自定义Excel模板导出数据
- WPF Step By Step 自定义模板
- 自定义模板标签,重定向,数据模型自定义排序
- Win8 修改项目模板中SampleDataSource,以使用自定义数据
- [转] 使用模板自定义 WPF 控件
- WPF中的数据模板(DataTemplate)
- WPF中的数据模板使用方式之一:ContentControl、ContentTemplate和TemplateSelector的使用
- WPF新手之如何自定义TreeView点击后的背景色
- WPF数据验证(5)―― 错误模板
- TreeView 展开时填充数据