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);
}
}