因为项目中需要用到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. ios初级必看视频

    http://pan.baidu.com/share/link?shareid=3315997225&uk=4113970285

  2. 自学C++第一天

    常引用: 可以用在复制构造函数里面.

  3. 测试markdown

    总结 写内容:博客重要的是内容,如果要讲形式与技术,应该深入学习html,这不是我的重点. 专注:就是利用MD这个好机会,忘记格式,用最简约的美观,来反衬出思考的清晰,内容的价值性. 今天 既要美国式 ...

  4. System Sounds: Alerts and Sound Effects

    #include <AudioToolbox/AudioToolbox.h> #include <CoreFoundation/CoreFoundation.h> // Def ...

  5. Linux系统启动错误 contains a file system with errors, check forced解决方法

    /dev/sda1 contains a file system with errors, check forced./dev/sda1: Inodes that were part of a cor ...

  6. 字符编码详解及由来(UNICODE,UTF-8,GBK)[转帖]

    相信許多人對字符編碼都不是很了解,透過下文可以清晰的理解各种字符编码方式详解及由来. 一直对字符的各种编码方式懵懵懂懂,什么ANSI.UNICODE.UTF-8.GB2312.GBK.DBCS.UCS ...

  7. 你必须牢记的*.Config-配置文件

    在我们第一次写web应用程序的时候,我们很快会接触到一个文件,那就是配置文件——web.config.我们的第一个比较深刻 的使用就是我们不需要把我们的数据库链接零散的写在我们的代码中了,我们只需要在 ...

  8. C++ 类继承的对象布局

    C++多重继承下,对象布局与编译器,是否为虚拟继承都有很大关系,下面将逐一分析其中的差别,相同点为都按照类继承的先后顺序布局(类内按照虚表.成员声明先后顺序排列).该类情况为子类按照继承顺序排列,如c ...

  9. akka各模块

    Akka的模块化做得非常好,它为不同的功能提供了不同的Jar包. akka-actor-2.0.jar – 标准Actor, 有类型Actor,等等 akka-remote-2.0.jar – 远程A ...

  10. nodejs--模块

    在客户端可以将所有的javascript代码分割成几个JS文件,然后在浏览器中将这些JS文件合并.但是在nodejs中是通过以模块为单位来划分所有功能的.每一个模块为一个JS文件,每一个模块中定义的全 ...