您的位置:首页 > 其它

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: