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 ...
随机推荐
- 《AI驱动下的开发者新生态》-2024长沙.NET技术社区活动-诚邀大家报名
回顾 2019年初,在.NET中文社区及包括苏州.广州.深圳等地区社区等大力推动.在众多企业的大力支持下,长沙地区的开发者们发起成立了长沙.NET技术社区,并组织了<2019年长沙开发者技术大会 ...
- springboot项目使用外置tomcat7部署项目
Springboot使用外置tomcat7部署运行 1.pom修改 2.tomcat底下config下catalina.properties 3.在tomcat的lib文件夹下添加 javax.el- ...
- AdvanceRestClient即食即用已集成definitions.json
下载链接: https://pan.baidu.com/s/19Vdwda8L8PIsYc9v3S3cdA 提取码: diq8 最后完成即可使用
- ORA-31655,ORA-39154 Objects from foreign schemas have been removed from import
问题说明 在执行数据泵导入时提示错误: 问题原因 执行导入的用户缺少导入数据库的权限. 解决问题 给用户赋予导入数据库权限: grant imp_full_database to 用户; 然后重新执行 ...
- Spring Boot图书管理系统项目实战-2.项目搭建
导航: pre: 1.系统功能和架构介绍 next:3.用户登录 只挑重点的讲,具体的请看项目源码. 1.项目源码: 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.添加依赖 <depe ...
- Vue实现简单计算器功能
知识点: v-model双向绑定 v-on事件绑定 实现效果 源码 <!DOCTYPE html> <html lang="en"> <head> ...
- python-获得特定程序的屏幕截图并保存为文件
import win32gui import win32ui import win32con name = "test.txt - Notepad" hwnd = win32gui ...
- 【Android 逆向】【攻防世界】黑客精神
1. apk 安装到手机,提示输入注册码 2. jadx打开apk MainActivity.java @Override // android.app.Activity public void on ...
- 01、NATS基础介绍
01.NATS基础介绍 项目中使用到了 NATS,但是之前并没有接触过,所以特意去学习了下,网上找了些资料,相对来说,都不是很全的介绍,所以特意记录下笔记,方便自己掌握,也希望可以帮助到其他小伙伴. ...
- 【Azure Developer】在使用中国区 Azure AD B2C时, AUTHORITY的值是什么呢?
问题描述 使用MSAL4J的SDK调用(源码地址:https://github.com/Azure-Samples/ms-identity-msal-java-samples/tree/main/3. ...