ListView 控件和 DataGridView 控件

ListView 是跟 Winform 中 DataGridView 用法以及显示效果差不多的一个 WPF 控件,可以通过列表的方式方便的显示数据;

<!-- ListView 控件 Xaml 代码 -->
<ListView Name="listView" Margin="10,10,9.6,10">
<ListView.View>
<GridView>
<GridViewColumn Header="任务"/>
<GridViewColumn Header="任务描述"/>
<GridViewColumn Header="循环周期(秒)"/>
<GridViewColumn Header="任务状态/>
</GridView>
</ListView.View>
</ListView>

DataGridView 控件的使用中,通常我们都会创建一个类用来储存数据,读取数据之后再创建一个这个类的集合,然后将集合赋给 dataGridView1.DataSource 属性;也可不用集合,直接在循环中把数据一条一条的加载 dateGridView1.Rows.Add()

// 先创建一个用来储存数据的类
class UserInfo
{
public string Name { get; set; }
public int Age { get; set; }
}
// WinForm:DataGridView 控件
// 方法一:创建一个对象集合,赋值给 DataSource 属性
List<UserInfo> infos = new List<UserInfo>();
for(int i = 0; i > 10; i++)
{
infos.Add(new UserInfo
{
Name = $"Light_{i}",
Age = i
});
}
dataGridView1.DataSource = infos; // 方法二:一条一条的添加数据
for(int i = 0; i > 10; i++)
{
dateGridView1.Rows.Add(new UserInfo
{
Name = $"Light_{i}",
Age = i
});
}

在 ListView 控件中 DataSource 属性在这里是 listView.ItemsSource;单条数据加载的方法是 listView.Items.Add();,整体用法还是大同小异;

// WPF:ListView 控件
// 方法一:创建一个对象集合,赋值给 ItemsSource 属性
List<UserInfo> infos = new List<UserInfo>();
for(int i = 0; i > 10; i++)
{
infos.Add(new UserInfo
{
Name = $"Light_{i}",
Age = i
});
}
listView.ItemsSource = infos; // 方法二:一条一条的添加数据
for(int i = 0; i > 10; i++)
{
listView.Items.Add(new UserInfo
{
Name = $"Light_{i}",
Age = i
});
}

INotifyPropertyChanged 接口

命名空间:System.ComponentModel

INotifyPropertyChanged 是一个非常强大的接口,用于向对象绑定的客户端控件发出对象属性已更改的通知;

用人话说就是:正常我们向上面一样,把对象绑定到控件用来显示数据,有一个缺点:每次更改对象的属性之后,我们需要手动的重新再去绑定数据,否则数据是不会刷新显示修改后的值的;

但是如果对象实现了 INotifyPropertyChanged 接口的话,我们根本不用担心这些问题,直接修改已绑定对象的属性,客户端就会自动刷新显示数据;

比如说,上面我们创建的 UserInfo 类就可以修改成这样:

class UserInfo : System.ComponentModel.INotifyPropertyChanged
{
private string name;
private int age; // 属性发生更改时触发的事件,由每个属性的 Set 访问器调用
public event PropertyChangedEventHandler PropertyChanged; public string Name
{
get => name;
set
{
name = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name"));
}
}
public string Age
{
get => age;
set
{
age = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Age"));
}
}
}

注意,我们为 UserInfo 类实现了 INotifyPropertyChanged 接口后,就不能用 List<T> 去创建集合了,需要用 ObservableCollection<T> 来创建 UserInfo 对象实例的集合;

因为List<T> 集合是强类型的 object 集合,绑定完成之后再进行修改添加操作是没办法通知已绑定的客户端控件的;

Observablecollection<T> 是动态数据集合,当 ObservableCollection<T> 添加一项时,会自动通知绑定的控件做相应修改;如果希望当 ObservableCollection<T> 集合中对象的属性发生改变时通知 UI,则 T 需要实现 INotifyPropertyChanged 接口;

// 用 Observablecollection<T> 创建集合
Observablecollection<UserInfo> infos = new Observablecollection<UserInfo>();
infos.Add(new UserInfo
{
Name = "Light",
Age = 18
}); // 为 DataGridView 控件绑定对象
dataGridView1.DataSource = infos; // 为 ListView 控件绑定对象
listView.ItemsSource = infos;

之后每次修改数据,就可以直接获取绑定的对象然后修改对象属性就可以了,无需再做任何操作;

// DataGridView 控件
// 获取选中行,返回当前绑定对象
UserInfo info = (UserInfo)dataGridView1.SelectedRows[0].DataBoundItem;
info.Name = "Liang";
info.Age = 18;
// ListView 控件
// 获取选中行,返回当前绑定对象
UserInfo info = (UserInfo)listView.SelectedItem;
info.Name = "Liang";
info.Age = 18;

C# ListView 控件和 INotifyPropertyChanged 接口的更多相关文章

  1. ListView 控件和 INotifyPropertyChanged 接口

    原文:ListView 控件和 INotifyPropertyChanged 接口 ListView 控件和 DataGridView 控件 ListView 是跟 Winform 中 DataGri ...

  2. ListView控件--2016年12月9日

    ListView属性 ListView   名称 说明 AccessKey 重写 WebControl.AccessKey 属性. 不支持将此属性设置 ListView 控件.(覆盖 WebContr ...

  3. 《ASP.NET1200例》ListView 控件与DataPager控件的结合<一>

    分页     在前一部分开始时介绍的原 HTML 设计中内含分页和排序,所以根据规范完整实现该网格的任务尚未完成.我们先分页,然后再排序. ListView 控件中的分页通过引入另一个新控件 Data ...

  4. 【Android基础】listview控件的使用(3)------Map与SimpleAdapter组成的多显示条目的Listview

    前面介绍的两种listview的使用都是最基础的,所以有很大的局限性,比如只能在一个item(即每一行的条目)中显示一个文本信息,这一篇我将介绍Map与SimpleAdapter组成的多显示条目的Li ...

  5. 【Android基础】listview控件的使用(2)-------继承自ListActivity的普通listview

    由于listview在android控件中的重要性,所以android为我们直接封装了一个类ListviewActivity,直接将listview封装在了activity之中,在本篇中,我将介绍在L ...

  6. 【Android基础】listview控件的使用(1)------最简单的listview的使用

    listview控件是项目开发中最常用的空间之一,我将慢慢推出关于listview的一系列的文章,先从最简单的,系统自带的listview开始吧! 先上效果图: activity_one.xml &l ...

  7. C#:ListView控件如何实现点击列表头进行排序?

    using System; using System.Collections; using System.Windows.Forms; namespace Common { /// <summa ...

  8. ListView控件

      打气筒工具:将R.layout.item_listview布局添加到相应的view控件里面 View view=LayoutInflater.from(ScondPro.this).inflate ...

  9. Android中ListView控件的使用

    Android中ListView控件的使用 ListView展示数据的原理 在Android中,其实ListView就相当于web中的jsp,Adapter是适配器,它就相当于web中的Servlet ...

随机推荐

  1. linux下实时查看tomcat运行日志 2017.12.4

    1.先切换到:cd usr/local/tomcat5/logs 2.tail -f catalina.out 3.这样运行时就可以实时查看运行日志了

  2. SVN汉化教程2017.10.6

    https://jingyan.baidu.com/album/b87fe19e95f5925219356853.html?picindex=4

  3. jQuery学习之旅 Item4 细说DOM操作

    jQuery-–DOM操作(文档处理) Dom是Document Object Model的缩写,意思是文档对象模型.DOM是一种与浏览器.平台.语言无关的接口,使用该接口可以轻松访问页面中所有的标准 ...

  4. Head First Servlet and JSP

    这书是原本这样还是翻译的问题?好多的地方大小写都写错了,比如javax.servlet,<servlet></servlet>.真是坑啊.

  5. Java 学习笔记 (四) Java 语句优化

    这个问题是从headfirst java看到的. 需求: 一个移动电话用的java通讯簿管理系统,要求最有效率的内存使用方法. 下面两段程序的优缺点,哪个占用内存更少. 第一段: Contact[]c ...

  6. 在MFC中对Excel的一些操作

    首先要在程序中加载CExcel.h和CExcel.cpp文件,这里面包装了很多函数和对Excel文件的操作,下面所有程序中的m_excel都是类CExcel的对象,如: private: _Appli ...

  7. BZOJ_2962_序列操作_线段树

    Description 有一个长度为n的序列,有三个操作1.I a b c表示将[a,b]这一段区间的元素集体增加c,2.R a b表示将[a,b]区间内所有元素变成相反数,3.Q a b c表示询问 ...

  8. BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组

    BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...

  9. BZOJ_5015_[Snoi2017]礼物_矩阵乘法

    BZOJ_5015_[Snoi2017]礼物_矩阵乘法 Description 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第 一个朋友会带给他 ...

  10. golang sync/atomic

    刚刚学习golang原子操作处理的时候发现github上面一个比较不错的golang学习项目 附上链接:https://github.com/polaris1119/The-Golang-Standa ...