经常看到小伙伴问,问已经绑定列表,在进行修改时,不会通知界面添加或删除。这时问题就在,一般使用的列表不会在添加时通知界面,因为他们没有通知。

本文:知道什么是通知的列表,如何去写一个通知列表

<!--more-->

在 C# 很少直接使用数组,因为数组难以指定类型,需要指定类型的,一般都会使用 List<T> 。而 List 我就叫他列表,继承 ICollection 的类,一般就可以叫列表。

但是在使用 ListView 直接给 List 作为 Source ,那么只会在初次显示,之后无论对 List 进行什么修改,都不会导致界面的列表项修改。

当然如果列表使用的类的属性有通知,对他进行修改,还是可以看到界面修改。

如果希望对列表修改时,界面也变化,那么简单方法是使用 ObservableCollection

不需要对 ObservableCollection 的属性进行通知,也就是 下面代码实际是不需要的

        public ObservableCollection<string> ObservableCollection{set{_observableCollection = value;OnPropertyChanged();}get{return _observableCollection;}}private ObservableCollection<string> _observableCollection;

如果需要修改项,只需要进行和List一样的添加或移除元素就可以。

如果想问,为何使用 ObservableCollection 就可以通知界面修改了元素,而使用 List 就不可以。

其实因为 ObservableCollection 继承了 INotifyCollectionChanged ,他可以通知 ListView 说修改了项。

如果对于上面的说法觉得还是不行,那么深一点,来解释一下 ListView 是如何知道 ObservableCollection 修改了。

首先在给 Source 值的时候,会自动判断是不是有 INotifyCollectionChanged ,如果是的话,自动监听。

因为 ListView 的 Source 大概就是这样,下面代码和真的 Source 是不一样,但是大概也是这样的

         /// <summary>/// 标识 <see cref="Source"/> 的依赖项属性。/// </summary>public static readonly DependencyProperty SourceProperty = DependencyProperty.Register("Source", typeof(object), typeof(MainPage), new PropertyMetadata(default(object), (s, e) =>{var c = s as INotifyCollectionChanged;if (c != null){c.CollectionChanged += (sender, args) =>{switch (args.Action){case NotifyCollectionChangedAction.Add:break;case NotifyCollectionChangedAction.Move:break;case NotifyCollectionChangedAction.Remove:break;case NotifyCollectionChangedAction.Replace:break;case NotifyCollectionChangedAction.Reset:break;default:throw new ArgumentOutOfRangeException();}};}}));/// <summary>/// 获取或设置/// </summary>public object Source{get { return (object) GetValue(SourceProperty); }set { SetValue(SourceProperty, value); }}

判断传入的是不 INotifyCollectionChanged ,如果是的话,获取他修改时,是什么,添加或删除,修改的元素是哪个。

于是这样就可以绑定时,进行修改 列表就可以让界面得到。

那么 ObservableCollection 缺少了很多东西,如添加多个元素,需要每次都进行 遍历,是不是可以自己写一个和 ObservableCollection 差不多的?

于是我就来写一个,很简单的代码

首先需要给他一个名字,这里是随意给的。

但是命名是需要时间,经过很久,我想到诡异的名字。

需要做一个泛型,然后继承 Collection 和通知。继承 Collection 可以少写代码,因为基本的添加他做了。

    public class AvaloniaCol<T> : Collection<T>, INotifyCollectionChanged

那么继承了 Collection 不可以直接写添加函数,如何做?实际他可以直接 InsertItem 就是添加会调用。

         protected override void InsertItem(int index, T item){base.InsertItem(index, item);CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, index));}

需要做的就是使用 原来的方法,但是加一个通知,通知时需要告诉当前是添加和添加的元素

写了添加自然需要写删除

         protected override void RemoveItem(int index){var temp = this[index];base.RemoveItem(index);CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, temp, index));}

代码就这么简单,在界面写个按钮,用于添加或移除

可以看到界面就是进行变换,就这么简单写通知列表。

代码:http://download.csdn.net/detail/lindexi_gd/9826807


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

转载于:https://www.cnblogs.com/lindexi/p/6949657.html

win10 uwp 通知列表相关推荐

  1. win10 uwp 通知Toast

    win10通知使用Toast 可以使用win10 模板添加通知 var t = Windows.UI.Notifications.ToastTemplateType.ToastText02; 使用Ge ...

  2. win10 UWP Controls by function

    Windows的 XAML UI 框架提供了很多控件,支持用户界面开发库. 我现在做的一个中文版的,很多都是照着微软写,除了注释 我们先学微软做一个简单的frame,新建Page,里面放title和跳 ...

  3. win10 uwp 如何使用DataTemplate

    这是数据模板,一般用在数组的绑定,显示数组中的元素. 假如我们有一个列表,列表里是书,包括书名.作者.还有出版,那么我们只有源信息,如何把它显示到我们的ListView,就需要DataTemplate ...

  4. win10 uwp 入门

    UWP是什么我在这里就不说,本文主要是介绍如何入门UWP,也是合并我写的博客. 关于UWP介绍可以参见:http://lib.csdn.net/article/csharp/32451 首先需要申请一 ...

  5. win10 uwp 商业游戏 1.1.5

    本文是在win10 uwp 商业游戏 基础上继续开发,添加一些无聊的游戏 因为在发布几个月,下载量很少,小伙伴说游戏就玩不到几分钟就不想玩,于是我就想加入其他游戏 下面我来告诉大家如何在游戏中添加多个 ...

  6. Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

    安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...

  7. win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序

    本文是一个非常简单的博客,让大家知道如何使用 asp dot net core 做后台,使用 UWP 或 WPF 等做前台. 本文因为没有什么业务,也不想做管理系统,所以看到起来是很简单. Visua ...

  8. 【Win10 UWP】QQ SDK(一):SDK基本使用方法

    每当开发一个应用需要社交分享的应用时,总是心里咯噔一下:到底什么时候分享能加上QQ和微信?除了WP8.0版本的微信SDK,官方似乎从未正面发布过适应时代发展的QQ SDK,就连后台,也没有一个可以创建 ...

  9. win10 uwp 通过 Win2d 完全控制笔迹绘制逻辑

    本文来告诉大家如何通过 Win2d 完全控制笔迹绘制逻辑,本文适合用来实现复杂的自定义逻辑,可以完全控制笔迹的行为.包括在书写过程中切换模式,如进行手势擦除切换为橡皮擦模式 本文提供的方法适合用来做复 ...

最新文章

  1. SAP在大中华区推出SAP数字化转型教育网络平台
  2. Excel更正错误#NAME?
  3. 503. 下一个更大元素 II
  4. 知识库问答中的关系识别研究回顾
  5. bat怎么获取前一天 的日期_bat脚本 得到前一天的日期
  6. 以个人身份加入.NET基金会
  7. oracle 压力测试工具benchmarksql
  8. 特殊功能,实现方法!
  9. 7-15 求组合数 (15 分)
  10. Xen的调度分析 (五) ——关于RTDS调度算法简介
  11. 牵手爱情,绎一份不了情缘
  12. html5 gif 只播放一次,使用JS和canvas实现gif动图的停止和播放代码
  13. Notebook for Integer Programming (Laurence A. Wolsey) - Well-Solved Problems
  14. 深度学习入门系列1:多层感知器概述
  15. python爬取斗鱼图片
  16. freemarker生成word文档,通过libreoffice完美转为pdf文件排版不乱(包含调用浏览器打印pdf)
  17. MongoDB体系结构
  18. k8s之Horizontal Pod Autoscaler(Pod水平自动伸缩)
  19. 电脑每次启动都硬盘自检
  20. 【OpenCV--模板匹配】

热门文章

  1. Python Django开发案例:显示登录页面
  2. JVM内存压缩开启/不开启各占几个字节
  3. 用python玩转数据第四周答案_用Python玩转数据_章节答案
  4. php如何获取常量的值,php – 如何获取常量的名称?
  5. 《17探索,18前行》
  6. 【已解决】Linux redhat 6.4上安装VNC Server
  7. 线性表易错点与线性表程序设计易错点
  8. 2.1.5 操作系统之线程概念与多线程模型
  9. 1.2.2 OSI参考模型(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层)
  10. c++ map用法_Pandas数据处理三板斧——map、apply、applymap详解