您的位置:首页 > 其它

WPF自定义TreeView显示结构通用类

2012-08-28 16:03 507 查看
  在WPF中,专门有HierarchicalDataTemplate用于自定义显示TreeView和ListBox的层次结构,结合后台定义的数据,得以实现五花八门的外观。我现在先简要说明一下HierarchicalDataTemplate的使用方式:

public class DataItem
{
public string Header { get; set; }
public IList<DataItem> Childs { get; set; }
}


  上面是树的一个结点类,包括了一个Header字段和子结点列表,下面则是对应的前台代码:

<Grid>
<Grid.Resources>
    <HierarchicalDataTemplate x:Key="myDataTemplate" ItemsSource="{Binding Childs}">
      <Label Content="{Binding Header}" />
    </HierarchicalDataTemplate>
  </Grid.Resources>
   <TreeView x:Name="TV_Test" ItemTemplate="{StaticResource myDataTemplate}" />
</Grid>


  注意到,HierarchicalDataTemplate的ItemsSource就是层叠显示的关键,它可以遍历对应数据的所有Childs字段,并显示成<Label ... />的形式。接下来,把DataItem类型的数据集合赋给TreeView控件的ItemSource就完成了树形结构的显示:

List<DataItem> dataList = new List<DataItem>();
DataItem item1 = new DataItem { Header = "结点1" };
item1.Childs = new List<DataItem>();
item1.Childs.Add(new DataItem { Header = "结点1-1" });
item1.Childs.Add(new DataItem { Header = "结点1-2" });
dataList.Add(item1);
dataList.Add(new DataItem { Header = "结点2" });
TV_Test.ItemsSource = dataList;


  所得结果如下图所示:

通用树结点类

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;

namespace EntityFramework.Common
{
/// <summary>
/// 实现了INotifyPropertyChanged接口通知的轻量级基类
/// </summary>
public abstract class ObservableBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

protected void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}

/// <summary>
/// 树数据类
/// </summary>
public class TreeViewData : ObservableBase
{
#region 私有字段

private string _Header;
private object _Tag;
private TreeViewData _Parent;
private ObservableCollection<TreeViewData> _Childs = new ObservableCollection<TreeViewData>();

#endregion

#region 公有属性

/// <summary>
/// 名字
/// </summary>
public string Header
{
get { return _Header; }
set { _Header = value; RaisePropertyChanged("Header"); }
}

/// <summary>
/// 标签
/// </summary>
public object Tag
{
get { return _Tag; }
set { _Tag = value; RaisePropertyChanged("Tag"); }
}

/// <summary>
/// 父项
/// </summary>
public TreeViewData Parent
{
get { return _Parent; }
set { _Parent = value; RaisePropertyChanged("Parent"); }
}

/// <summary>
/// 子项
/// </summary>
public ObservableCollection<TreeViewData> Childs
{
get { return _Childs; }
set { _Childs = value; RaisePropertyChanged("Childs"); }
}

#endregion

#region 方法函数

public TreeViewData() { }

public TreeViewData(string header)
{
_Header = header;
}

public TreeViewData(string header, object tag, TreeViewData parent = null)
{
_Header = header;
_Tag = tag;
_Parent = parent;
}

/// <summary>
/// 添加子元素
/// </summary>
/// <param name="childs">子元素</param>
/// <returns>个数</returns>
public void AddChild(TreeViewData child)
{
child.Parent = this;
_Childs.Add(child);
}

/// <summary>
/// 添加子元素集合
/// </summary>
/// <param name="childs">子元素</param>
/// <returns>个数</returns>
public int AddChilds(IEnumerable<TreeViewData> childs)
{
int nCount = 0;
foreach (TreeViewData item in childs)
{
AddChild(item); ++nCount;
}
return nCount;
}

/// <summary>
/// 将指定名称的所有子节点从父元素中移除
/// </summary>
/// <param name="parent">父元素</param>
/// <param name="name">子节点名称</param>
public void RemoveChilds(TreeViewData parent, string name)
{
for (int i = 0; i < parent.Childs.Count; ++i)
{
if (parent.Childs[i].Header == name)
parent.Childs.Remove(parent.Childs[i]);
}
}

public override string ToString()
{
return _Header;
}

#endregion
}
}


  这个类实现了INotifyPropertyChanged接口,能够更好地实现前台数据刷新,并且只初始化得当,还可以直接往上追踪父结点,删除、添加子结点。

  转载请注明原址:/article/5813031.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: