WPF MVVM 集合内容更改时如何添加操作,触发通知
用过mvvm设计WFP程序的人都知道,在我们mvvm中有一个非常重要的接口叫做 INotifyPropertyChanged
这个接口的主要作用是用于触发属性更改时向我们xaml中绑定此属性值的控件发起通知,从而页面响应我们的数据变化。
那么页面绑定的集合发生变化,我如何响应给页面呢?
这时候我们的ObservableCollection集合就出现了,它的作用是在我们的集合修改,添加删除时会向我们的页面发送通知。这样一来我们的操作就方便多了,我们只需要让我们页面上的列表控件绑定上这样的一个数据源,就可以实现更新了。
可是这时候问题又出现了,我们如何在集合变化时添加业务呢?
比如我有一个下载列表和一个上传列表,有一个地方显示目前的上传下载任务数量,我们如何在上传和下载变化时动态改变当前任务数量。
我们可以用非常死的办法,在上传和下载变化的地方都加上刷新当前数量的代码,但是这样不利于维护,并且写起来很累。
ObservableCollection只能根据变化将改变通知到绑定此数据源的控件,INotifyPropertyChanged更是只有集合被赋值的时候才会触发更改。
这时候我们的框架就给我们提供了一个很好用的接口了——INotifyCollectionChanged
顾名思义,这是微软为了我们提供的一个集合更改触发通知的接口了。我们来看一个例子。
public class TransferViewModel : ViewModelBase, INotifyCollectionChanged
{ private volatile ObservableCollection<UpLoadProgressModel> datasource;
public ObservableCollection<UpLoadProgressModel> Datasource
{
get { return this.datasource; }
set
{
this.datasource = value;
RaisePropertyChanged(() => Datasource);
}
} private volatile ObservableCollection<DownLoadModel> downloadSource;
public ObservableCollection<DownLoadModel> DownloadSource
{
get { return this.downloadSource; }
set
{
this.downloadSource = value;
RaisePropertyChanged(() => DownloadSource);
}
}
}
上面两个集合,第一个上传第二个下载,并且我们这个类已经实现了INotifyCollectionChanged接口
我们需要实现其中的方法,与INotifyPropertyChanged类似
public event NotifyCollectionChangedEventHandler CollectionChanged;
public virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
CollectionChanged?.Invoke(this, e);
}
这时候对集合的增删改我们需要生成自己的方法,以添加上传为例
//写入上传队列的事件通知
public void AddUpLoad(UpLoadProgressModel model)
{
this.Datasource.Add(model);
CollectionChanged += new NotifyCollectionChangedEventHandler(List_CollectionChanged);
RaisePropertyChanged(() => Datasource);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, model));
}
第二步就是将业务绑定到集合更改的事件上。
第四步就是发出我们的集合绑定方法,传入参数是集合更改的操作类型和更改的对象。并且执行第二步的绑定到事件的业务方法
WPF MVVM 集合内容更改时如何添加操作,触发通知的更多相关文章
- (WPF) MVVM: 动态添加控件及绑定。
比如需要显示一个键盘,里面有各个按键.实现的效果如下: 之前的思路,就是建立一个singleKey的控件,然后在后台用代码动态的添加到父控件里去, 再用代码在后台进行绑定. 这种实现方法并不是真正的M ...
- 问题.NET--win7 IIS唯一密钥属性“VALUE”设置为“DEFAULT.ASPX”时,无法添加类型为“add”的重复集合
问题现象:.NET--win7 IIS唯一密钥属性“VALUE”设置为“DEFAULT.ASPX”时,无法添加类型为“add”的重复集合 问题处理: 内容摘要: HTTP 错误 500.19 - ...
- WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对
WPF MVVM UI分离之<交互与数据分离> 在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下 ...
- WPF/MVVM Quick Start Tutorial - WPF/MVVM 快速入门教程 -原文,翻译及一点自己的补充
转载自 https://www.codeproject.com/articles/165368/wpf-mvvm-quick-start-tutorial WPF/MVVM Quick Start T ...
- WPF MVVM 学习总结(一)
---恢复内容开始--- 1. MVVM简介 在WPF中,MVVM(View-ViewModel-Model)开发模型用的很多,它具有低耦合,可重用行,相对独立的设计和逻辑.所以备受广大开发者的喜爱. ...
- 从0 开始 WPF MVVM 企业级框架实现与说明 ---- 第二讲 WPF中 绑定
说到WPF, 当然得从绑定说起,这也是WPF做的很成功的一个地方,这也是现在大家伙都在抛弃使用winform的其中一个主要原因,Binding这个东西从早说到完其实都说不完的,我先就做一些基本的介绍, ...
- ViewModel从未如此清爽 - 轻量级WPF MVVM框架Stylet
Stylet是我最近发现的一个WPF MVVM框架, 在博客园上搜了一下, 相关的文章基本没有, 所以写了这个入门的文章推荐给大家. Stylet是受Caliburn Micro项目的启发, 所以借鉴 ...
- WPF MVVM从入门到精通7:关闭窗口和打开新窗口
原文:WPF MVVM从入门到精通7:关闭窗口和打开新窗口 WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通3:数据绑定 ...
- WPF MVVM从入门到精通1:MVVM模式简介
原文:WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通3:数据绑定 W ...
- WPF+MVVM数据绑定问题集锦
1. 数据绑定的问题 在使用数据绑定时,一般使用 ObservableCollection<T> 类,不使用list列表集合,因为list数据发生变化时,UI界面不更新,而Observa ...
随机推荐
- 好书推荐之《深入理解JAVA虚拟机》
大佬推进 这本书作为JVM的入门书籍,是每一个JAVA工程师必备的. 简介 这是一部从工作原理和工程实践两个维度深入剖析JVM的著作,是计算机领域公认的经典,繁体版在台湾也颇受欢迎. 自2011年上市 ...
- burpsuit+adb+逍遥模拟器
安卓7之后,单纯的将burpsuit的证书导出手动安装到模拟器中已经不行了,app可以只信任指定证书和系统内置的证书,后续用户安装的证书是不生效的,只能想办法装到系统内部 需要将证书通过openssl ...
- 二进制文件转Hex和Wav文件转Hex的Java代码
二进制文件转Hex 对于需要将二进制数据写入固件的场景(例如mp3文件), 需要将二进制文件表示为byte数组 import java.io.File; import java.io.FileInpu ...
- Java集合框架学习(五) ArrayList详解
Arraylist介绍 Arraylist类实现了List接口. public class ArrayList<E> extends AbstractList<E> imple ...
- python第二章pta习题总结
chapter2 一.选择填空判断部分 1. C语言中,变量变的是内存空间中的值,不变的是地址: Python中,变量变的是地址,不变的是内存空间中的值. 2. 3.bool('False') 的返回 ...
- 编译静态库遇到的 LNK2019 报错
前文提到了 CMake 学习 文末基本涵盖了我遇到的编译问题,但是在得到一个编译好的 .lib 文件后,还需要放到项目中引用成功后才算真正的完成静态库的编译 嗯,我之所以说这些是因为我在项目中链接静态 ...
- Hexo - 搭建个人博客的bug集合
按照很多视频教程进行操作,发现到hexo d这一步后,无法部署到github远端. 目前的解决方法: npm un hexo-deployer-git npm i hexojs/hexo-deploy ...
- 【Android逆向】破解看雪9月算法破解第二题
1. apk安装到手机,一样的界面,随便输入一样的报错 2. apk拖入到jadx重看看 public native String sha1(String str); static { System. ...
- django从配置文件中读取数据库信息
创建配置文件my.cnf [client] database=django_db user=root password=123456 host=127.0.0.1 port=3306 settings ...
- 【开发工具】Linux 服务器 Shell 脚本简单应用(MySql备份等脚本)
上一章介绍完基础[开发工具]Linux 服务器 Shell 脚本简单入门,这一章结合实际运用 对于 do while if else等流程控制基础不再说明,和编程语言大同小异,可以在实际的脚本使用中学 ...