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 ...
随机推荐
- 从零开始的 dbt 入门教程 (dbt core 开发进阶篇)
引 在上一篇文章中,我们花了专门的篇幅介绍了 dbt 更多实用的命令,那么我们继续按照之前的约定来聊 dbt 中你可能会遇到的疑惑以及有用的概念,如果你是 dbt 初学者,我相信如下知识点一定会对你有 ...
- Linux中$home和波浪号~
在Linux中当前用户的主目录可以有三种表示方法,都是等效的[正常不改配置情况下]例如用户名为sy,进入当前用户的主目录/home/sy 输入cd ~ 或输入cd $HOME 或输入cd /home/ ...
- CSS实现展开动画
CSS实现展开动画 展开收起效果是比较常见的一种交互方式,通常的做法是控制display属性值在none和其它值之间切换,虽说功能可以实现,但是效果略显生硬,所以会有这样的需求--希望元素展开收起能具 ...
- SpringBoot下Akka的简单使用
SpringBoot下Akka的简单使用 Akka框架实现一个异步消息传输,通过定义演员来处理业务逻辑. 首先引入依赖 <!-- akka --> <dependency> & ...
- 解决Spring boot 单元测试,无法读取配置文件问题。
1.启动类上加上@EnableConfigurationProperties 2.springboot版本springboot 2.X版本在单元测试中读取不到yml配置文件的值这是个大坑,在项目中写单 ...
- 【华为机试ACM基础#02】从单向链表中删除指定值的节点、输出单向链表中倒数第k个节点(熟悉链表的输入方式)
从单向链表中删除指定值的节点 输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针. 链表的值不能重复. 构造过程,例如输入一行数据为: 6 2 1 2 ...
- 【Azure 应用服务】在Azure上部署一套VUE框架的单页面应用,有什么可以参考的文档呢?
问题描述 在Azure上部署一套VUE框架的单页面应用,有什么可以参考的文档呢? 问题回答 Azure官方上并没有VUE框架的实例代码,但是可以参考Node JS项目,来进行设置. 在 Azure 中 ...
- 文心一言 VS 讯飞星火 VS chatgpt (205)-- 算法导论15.4 1题
一.求〈1,0,0,1,0,1,0,1〉和〈0,1,0,1,1,0,1,1,0〉的一个LCS.需要写代码的时候,请用go语言. 文心一言,代码正常运行: 在Go语言中,求两个序列的最长公共子序列(Lo ...
- STM32SPIFLASH读写
STM32SPIFLASH读写 1.1 SPI注意事项 SPI是同步通信,即通信双方每次信息交互必会带有一问一答,这代表在正常的单核MCU(例如STM32)中很难实现软件模拟的双向SPI通信(TFT屏 ...
- .NET开源功能强大的串口调试工具
前言 今天大姚给大家分享一款.NET开源的.功能强大的串口调试工具:LLCOM. 工具介绍 LLCOM是一个.NET开源的.功能强大的串口调试工具.支持Lua自动化处理.串口调试.串口监听.串口曲线. ...