因为项目中需要用到TreeView控件,由于是第一次在WPF中用到,因此事先在网上搜了很多关于数据绑定的方法介绍,个人经过实际应用,觉得WPF中的HierarchicalDataTemplate定义模板确实好用很多,但是今天在自己的WPF+MVVM项目中使用了另一种方式。代码不妥之处,望赐教。

先说数据绑定:

1、前台Xmal代码:(没有使用模板定义)

<TreeView Name="treeview"/>

/2、在后台的XAML交互逻辑cs代码添加数据上下文并将 treeview作为参数传递到对应的ViewModel中

public   treeView()
    {
      InitializeComponent();
     this.DataContext = new treeViewVM(this.treeview);
     }

3、定义实体类,此处举例

/// contry: 县城实体类(属性说明自动提取数据库字段的描述信息,对应数据库中的contry表)

public class contry 
{
public contry ();

string  MC{get;set;}

int ID{get;set;}

int parentID{get;set}

}

/4、在 treeViewVM中实现数据的绑定

//构造函数,接收前台传递过来的treeView对象

public treeViewVM(TreeView tr)
{
this.treeview = tr;
initialCommand();
RefreshTreeView(); //刷新treeView,获取数据
}

/// <summary>
/// 创建TreeView的Item
/// </summary>
/// <param name=""></param>
/// <returns></returns>
private TreeViewItem CreateTreeViewItem(contry cty)
{
TreeViewItem tvi = new TreeViewItem();
tvi.Header = cty.MC;
tvi.Tag = cty;
tvi.IsExpanded = true;// 设置数据列表为展开
return tvi;
}

/// <summary>
/// 获取treeView中的一级节点,并实现递归遍历
/// </summary>
/// <param name="contryList"></param>
/// <returns></returns>
public List<contry > Bind(List<contry > contryList)
{

contryList= DicCacheList.Instance.GetListByTableName<contry >(true);//在缓存的字典中获取contry数据表的list集合,具体封装的方法此处省略;
var list = contryList.Where(a => a.parentID== null || a.parentID== "_").ToList();//事先在数据库中设置一级节点的parentID(父级ID)为空或者为"_",此处获取一级节点的数据集合;

if (list.Count == 0)
{
return null;
}
list.ForEach(a =>
{
TreeViewItem tvi1 = CreateTreeViewItem(a);
treeview.Items.Add(tvi1);
FindDownward(contryList, a.ID, tvi1);
});
return null;
}

/// <summary>
/// 递归遍历treeview的实现方法
/// </summary>
/// <param name=""></param>
/// <param name="id"></param>
/// <param name="tvi"></param>
/// <returns></returns>
public contry FindDownward(List<contry> contryList, string id, TreeViewItem tvi)
{
if (contryList == null)
{
return null;
}
var list = contryList.Where(a => a.parentID== id).ToList();

if (list.Count == 0)
{
return null;
}
list.ForEach(a =>
{
TreeViewItem tvi2 = CreateTreeViewItem(a);
tvi.Items.Add(tvi2);
FindDownward(contryList, a.ID, tvi2);
});
return null;
}

/// <summary>
/// 获取treeView列表,刷新列表
/// </summary>
private void RefreshTreeView()
{
var contryList= DicCacheList.Instance.GetListByTableName<contry>(true);
treeview.Items.Clear();
Bind(contryList);
}

WPF中TreeView的使用的更多相关文章

  1. WPF中TreeView.BringIntoView方法的替代方案

    原文:WPF中TreeView.BringIntoView方法的替代方案 WPF中TreeView.BringIntoView方法的替代方案 周银辉 WPF中TreeView.BringIntoVie ...

  2. WPF中TreeView控件的使用案例

    WPF总体来说还是比较方便的,其中变化最大的主要是Listview和Treeview控件,而且TreeView似乎在WPF是一个备受指责的控件,很多人说他不好用.我这个demo主要是在wpf中使用Tr ...

  3. WPF中TreeView单击展开其子元素以及点击一个元素展开其他元素收起

    TreeView单击展开其子元素: 在WPF的TreeView控件中,要想展开它的子元素,我们必须要鼠标左键点两下或者右键点一下,那么我们怎样实现左键点一下就使它展开呢? Xaml: <Grid ...

  4. WPF中TreeView控件SelectedItemChanged方法的MVVM绑定

    问题描述:左侧treeview控件中点击不同类别的节点时,右侧的页面会显示不同的权限.比如对于My Publications,拥有Modify和Delete两种权限,对于My Subscription ...

  5. WPF中TreeView控件数据绑定和后台动态添加数据(二)

    写在前面:在(一)中,介绍了TreeView控件MVVM模式下数据绑定的方法.在这篇文章中,将总结给节点添加事件的方法,这样说有些不对,总之实现的效果就是点击某个节点,将出现对应于该节点的页面或者数据 ...

  6. WPF中TreeView控件数据绑定和后台动态添加数据(一)

    数据绑定: 更新内容:补充在MVVM模式上的TreeView控件数据绑定的代码. xaml代码: <TreeView Name="syntaxTree" ItemsSourc ...

  7. WPF中TreeView的+-号和连线style的一种实现

    最近又开始跟WPF打交道,项目里面用到了TreeView这个控件.然后需要有一个连线的外观就像是这样 二话不说,百度了一下,找到一个实现, 通道. 把代码拷贝到项目里面,跑了一下,看上去还不错.但是这 ...

  8. WPF中TreeView数据结构解析

    XAML.CS代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...

  9. WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条)

    原文:WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) 对于TreeView而言: TreeViewAut ...

随机推荐

  1. 从零开始学习Node.js例子九 设置HTTP头

    server.js //basic server的配置文件 ; var server = require('./basicserver').createServer(); server.useFavI ...

  2. Swift----函数 、 闭包 、 枚举 、 类和结构体 、 属性

    1 数组排序 1.1 问题 本案例实现一个整型数组排序的函数,数组排序的规则由传递的规则函数决定. 1.2 方案 首先定义一个整型数组排序函数sortInts,该函数有一个整型数组类型的参数,该参数必 ...

  3. [Error] ld returned 1 exit status

    试试重启你的编译器,不稳定的编译器可能会有这种情况.当然不排除其他原因,若是重启了还不好使,就要看代码哪写错喽!!

  4. matlab 批量提取CNN特征

    无类别,图像混合放置: clear close all addpath ./matlab model= './models/bvlc_reference_caffenet/deploy.prototx ...

  5. 使用MySQL制作SNP146数据库

    SNP数据(txt)文件可以在此下载:http://hgdownload.cse.ucsc.edu/goldenPath/hg19/database/ 下载.解压data之后,启动MySQL serv ...

  6. 初学JAVA的 感想 尹鑫磊

    开始学习任何一门课(包括java),兴趣最重要.一直觉得自己在学计算机编程语言,学习了很多,但每门语言都停留在知识边缘地带,都没深入到它们的精华部分,对它们的精华部分知之甚少,于是趁学校开设这门课,并 ...

  7. 用unity4.3发布WINDOWS STORE APP应用的方法

    http://www.cnblogs.com/suxsho/ 原创,转载请声明 ============================================================ ...

  8. Ruby 方法

    Ruby 方法 Ruby 方法与其他编程语言中的函数类似.Ruby 方法用于捆绑一个或多个重复的语句到一个单元中. 方法名应以小写字母开头.如果您以大写字母作为方法名的开头,Ruby 可能会把它当作常 ...

  9. 使用cocos2d-x3.4结合cocos2.1.5制作小游戏《亲亲小熊》

    在最新的cocos集成环境中,CocosStudio已经集成到cocos中了,至于界面的制作和编辑器的基本使用在cocos官网有详细教程, 这里就不细说,资源下载和详情请参看官网教程:http://c ...

  10. Pyside开篇杂记

    最近学习刚开始学习pyside,基本了解了一些类的用法,个人感觉就接触而言与pyqt并无本质区别. 双方资料基本可以相互借鉴,个人更倾向与pyside,查阅资料时也经常会在pyqt内得到解决方案. 之 ...