相关文章推荐
阳刚的板凳  ·  重写经典对联!ChatGPT中文能力终极挑战 ...·  8 月前    · 
坚强的牛肉面  ·  ESP32-S3中断,uart_driver ...·  1 年前    · 
绅士的茴香  ·  加速Python循环的12种方法,最高可以提 ...·  1 年前    · 
鬼畜的大象  ·  wpf ...·  1 年前    · 
不拘小节的砖头  ·  pyqtgragh——动态数据可视化:绘制静 ...·  2 年前    · 
Code  ›  win10 uwp 通知列表开发者社区
windows 10 uwp
https://cloud.tencent.com/developer/article/1342158
踢足球的豌豆
2 年前
作者头像
林德熙
0 篇文章

win10 uwp 通知列表

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 林德熙的博客 > win10 uwp 通知列表

win10 uwp 通知列表

作者头像
林德熙
发布 于 2018-09-18 18:00:02
365 0
发布 于 2018-09-18 18:00:02
举报

经常看到小伙伴问,问已经绑定列表,在进行修改时,不会通知界面添加或删除。这时问题就在,一般使用的列表不会在添加时通知界面,因为他们没有通知。 本文:知道什么是通知的列表,如何去写一个通知列表。

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

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

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

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

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

        public ObservableCollection<string> ObservableCollection
                _observableCollection = value;
                OnPropertyChanged();
                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));
 
推荐文章
阳刚的板凳  ·  重写经典对联!ChatGPT中文能力终极挑战|江南|下联|上联_网易订阅
8 月前
坚强的牛肉面  ·  ESP32-S3中断,uart_driver_install返回错误ESP_ERR_NOT_FOUND_esp32 could not allocate an interrupt for uart-C
1 年前
绅士的茴香  ·  加速Python循环的12种方法,最高可以提速900倍-腾讯云开发者社区-腾讯云
1 年前
鬼畜的大象  ·  wpf 在“System.Windows.Baml2006.TypeConverterMarkupExtension”上提供值时引发了异常-CSDN博客
1 年前
不拘小节的砖头  ·  pyqtgragh——动态数据可视化:绘制静态和动态两种数据曲线_wx639182495bc78的技术博客_51CTO博客
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号