# WPF 创建TreeView,MVVM模式绑定数据库数据
·
C# WPF 创建TreeView,MVVM模式绑定数据库数据
在网上淘了很久自己研究了半天的时间终于做出来了,有很多不足之处,欢迎大家提意见,这里面用到了Prism.Mvvm,也可使用c# System.ComponentModel类库中的 INotifyPropertyChanged来替代,有需要的可以去自行下载
Html页面代码
这里很简单,绑定了后台的几个属性,
TreeView 的ItemsSource绑定到TreeNode后台和TreeView交互的属性
ChildNodes:节点
NodeName:节点名称
<TreeView Name="chapterTree" Grid.Column="0" Grid.Row="1" ItemsSource="{Binding TreeNode}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=ChildNodes}">
<StackPanel>
<Label Content="{Binding Path=NodeName}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
后台代码
- 首先新建一个TreeNode类保存节点属性,定义如下所示:
public class TreeNode {
public int NodeID { get; set; }
public int ParentID { get; set; }
public string NodeName { get; set; }
public List<TreeNode> ChildNodes { get; set; }
public TreeNode() {
ChildNodes = new List<TreeNode>();
}
}
- 获取数据库数据源
List treeFile:放入生成节点的字段
DataTable treeDataTable :数据源
这里注意treeFile的内容必须包含在treeDataTable 内
/// <summary>
/// 获取绑定源
/// </summary>
/// <param name="treeFile">绑定的字段</param>
/// <param name="treeDataTable">绑定的数据来源</param>
private List<TreeNode> InPutTreeNode(List<string> treeFile ,DataTable treeDataTable) {
bool isOk;
//转中文,因为数据库中是英文的字段所以封装了一个中英文转换类,没有转换的可以不要这段FOR循环
for (int i = 0; i < treeFile.Count; i++) {
treeFile[i] = Common.UtoC(sqlForm, treeFile[i], out isOk);
}
//检查数据源是否包含字段
for (int i = 0; i < treeFile.Count; i++) {
if (treeDataTable.Columns.Contains(treeFile[i])) {
continue;
} else {
Common.SetErrmsg = "error_数据_树结构绑定错误,不存在的字段";
return null;
}
}
int id = 1;
List<TreeNode> allTree = new List<TreeNode>();
foreach (DataRow row in treeDataTable.Rows) {
bool haveNull = true;
//检查是否存在空值
for (int i = 0; i < treeFile.Count; i++) {
if (string.IsNullOrWhiteSpace(row[treeFile[i]].ToString())) {
haveNull = true;
break;
}
}
if (haveNull) continue;
for (int i = 0; i < treeFile.Count; i++) {
TreeNode treeNodes = new TreeNode();
var dd = from tr in allTree
where tr.ParentID == i
where tr.NodeName == row[treeFile[i]].ToString()
select tr.ParentID;
var ds = dd.ToList();
if (ds.Count <= 0) {
if (i!=0) {
//获取索引
var dd2 = from tr in allTree
//where tr.ParentID == i - 1
where tr.NodeName == row[treeFile[i - 1]].ToString()
select tr.ParentID;
var s1 = dd2.ToList();
//获取id
var dd1 = from tr in allTree
where tr.ParentID == s1[0]
where tr.NodeName == row[treeFile[i-1]].ToString()
select tr.NodeID;
var s = dd1.ToList();
//检查是否存在
var dd3 = from tr in allTree
where tr.ParentID == s[0]
where tr.NodeName == row[treeFile[i]].ToString()
select tr.NodeID;
var s2 = dd3.ToList();
if (s2.Count>0) {
continue;
}
treeNodes.ParentID = s[0];
treeNodes.NodeID = id;
treeNodes.NodeName = row[treeFile[i]].ToString();
allTree.Add(treeNodes);
id++;
continue;
}
treeNodes.ParentID = i;
treeNodes.NodeID = id;
treeNodes.NodeName = row[treeFile[i]].ToString();
allTree.Add(treeNodes);
id++;
}
}
}
return allTree;
}
获取生成TreeView的数据
直接搬网上的了
private List<TreeNode> getNodes(int parentID, List<TreeNode> nodes) {
if (nodes==null) {
return null;
}
List<TreeNode> mainNodes = nodes.Where(x => x.ParentID == parentID).ToList();
List<TreeNode> otherNodes = nodes.Where(x => x.ParentID != parentID).ToList();
foreach (TreeNode node in mainNodes)
node.ChildNodes = getNodes(node.NodeID, otherNodes);
return mainNodes;
}
MVVM绑定属性,由于数据量有点大这里我起了一个线程来生成树结构
//树结构绑定数据
private List<TreeNode> treeNode;//树结构显示数据
public List<TreeNode> TreeNode {
get {
Thread thread = new Thread(threadOne);
thread.Start();
return treeNode;
}
set {
treeNode = value;
this.OnPropertyChanged("TreeNode");
}
}
线程调用的方法
private void threadOne() {
List<string> vs = new List<string> { "WeiHuBanZu", "SuoShuXianLu", "Name" };
TreeNode = getNodes(0, InPutTreeNode(vs, dataTable));
}
效果

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)