当前位置:首页 > C#编程 > C#/.net框架 > 正文内容

谈谈ObservableCollection观察者集合

Jorge2年前 (2022-05-08)C#/.net框架723

注:

事件很常见,但有重复的代码量。

如果你想简化一下事件的编程,而且是整个程序只使用一个像事件池一样的东西,可以尝试使用下文讲的ObservableCollection观察者集合来做到。


ObservableCollection<T>类表示一个动态数据集合,在添加项,移除项或刷新整个列表时,刺激和将提供通知

通知可以由下面的枚举知晓你对集合做了什么才触发的事件。


image.png

C#
using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication1{
    class Program
    {
        static void Main(string[] args)
        {
            var b = new ObservableCollection<int>();
            b.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(b_CollectionChanged);

            b.Add(100);
            b.Add(100);
            b.Add(100);
            b[0] = 200; ;
            b[1] = 200;
        }

        static void b_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            if (sender is ObservableCollection<int>)
            {
                ObservableCollection<int> t = sender as ObservableCollection<int>;
                if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
                {
                    
                }
                else if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
                {

                }
                else if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Move)
                {

                }
                else if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Replace)
                {
                    foreach (var item in e.OldItems)
                    {
                        Console.WriteLine(item.ToString()); ;

                    }
                    foreach (var item in e.NewItems)
                    {
                        Console.WriteLine(item.ToString());

                    }

                }
                else if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Reset)
                {

                }
                else
                {

                }
            }
        }

    }}


这个集合可以理解为其任何一个元素做操作都会触发事件。

如果你想这样:

各元素有自己独的事件。 

那该如何做呢?


答案是没这种功能。但是我们可以使用多个ObservableCollection<T>创造这种功能。


像下面这样实现这个需求:

C#
    public enum WindowEventEnum        {
            硬件初始化完成,急停,停止,运行        }
        public Dictionary<WindowEventEnum, ObservableCollection<bool>> Obc = new Dictionary<WindowEventEnum, ObservableCollection<bool>>()
        {
            {  WindowEventEnum.硬件初始化完成, new ObservableCollection<bool>() { false} },
            {  WindowEventEnum.急停, new ObservableCollection<bool>() { false} },
            {  WindowEventEnum.停止, new ObservableCollection<bool>() { false} },
            {  WindowEventEnum.运行, new ObservableCollection<bool>() { false} }
        };

然后其它的类来注册我们想要的事件:

C#
 var res2 = BundleRuntime.Instance.GetService<WindowsEvents>();
            if (res2.Count > 0)
            {
                winEvents = res2[0];
                winEvents.Obc[WindowsEvents.WindowEventEnum.硬件初始化完成].CollectionChanged += Obc_CollectionChanged;
                winEvents.Obc[WindowsEvents.WindowEventEnum.急停].CollectionChanged += MotionDeviceForm_CollectionChanged;
                winEvents.Obc[WindowsEvents.WindowEventEnum.停止].CollectionChanged += MotionDeviceForm_CollectionChanged1;
                winEvents.Obc[WindowsEvents.WindowEventEnum.运行].CollectionChanged += MotionDeviceForm_CollectionChanged2;
            }


触发事件的代码:

C#
 private void button1_Click(object sender, EventArgs e)
 {
    winEvents.Obc[WindowsEvents.WindowEventEnum.急停][0] = true;

    winEvents.Obc[WindowsEvents.WindowEventEnum.停止][0] = false;
    winEvents.Obc[WindowsEvents.WindowEventEnum.运行][0] = false;
 }


事件函数:

C#
 private void MotionDeviceForm_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (winEvents.Obc[WindowsEvents.WindowEventEnum.急停][0])
            {
                flowOperation.estop();
                return;
            }
        }


这样的效果是像实现了一个事件池一样的功能。

好处是不是再自己写事件了。

因为ObservableCollection<T>可以是T类型,所以事件数据源可以是任何类型,足够灵活完成你想要的数据传递。



--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!


扫描二维码推送至手机访问。

版权声明:本文由7点博客发布,如需转载请注明出处。

本文链接:http://6dot.cn/?id=45

标签: .NET.NET框架
分享给朋友:

“谈谈ObservableCollection观察者集合” 的相关文章

windows下c#程序提高实时性

windows下c#程序提高实时性

引言:我们手里的运控软件对实时性有了新要求。因为同设备上运行的其它视觉软件对cpu时间有变态的占用,压缩了运控软件的cpu占用时间。我们知道如果视觉软件卡一下,最多是处理时间长一点,但是运控软件卡一下,那就意味着撞机的问题,这个要严重得多。这个问题会持续把研究结果更新到本贴子。(一)提升线程和进程的...

C#的变迁史 - C# 4.0 之线程安全集合篇

C#的变迁史 - C# 4.0 之线程安全集合篇

作为多线程和并行计算不得不考虑的问题就是临界资源的访问问题,解决临界资源的访问通常是加锁或者是使用信号量,这个大家应该很熟悉了。  而集合作为一种重要的临界资源,通用性更广,为了让大家更安全的使用它们,微软为我们带来了强大的并行集合:System.Collections.Concurrent里面的各...

计算代码执行时间,可以精确到十亿分之一秒

计算代码执行时间,可以精确到十亿分之一秒

注:.Net的Stopwatch类可以精确到1/10000毫秒, 有没有更精确的计时吗?见下面的代码。暂时没试过效果,大家可以试下。计算某个代码片段的执行时间,精确到CPU执行一条指令所用的时间(十亿分之一秒),可用于精确计算某个算法的执行时间。 代码:C#using Syste...

关于C#项目引用的一点经验

关于C#项目引用的一点经验

关于项目引用,有几种:(一)这种是引用系统的程序集(二)下面这种是引用你自己的项目“解决方案”(三)最后一种是浏览本机上的项目的dll。对于工程中有几十个项目的软件来说,虽然使用(二)是很方便。但是会编译速度奇慢,而且随着项目越多越慢。貌似他run之前都会把所有项目都试图更新一下。勇哥宿舍的电脑,实...

c#——表达式树在LINQ动态查询

c#——表达式树在LINQ动态查询

一般如果逻辑比较简单,只是存在有的情况多一个查询条件,有的情况不需要添加该查询条件简单方式这样操作就可以了C#public IQueryable<FileImport> DynamicChainedSyntax (IQueryable<FileImport&g...

C# 查询运算符测试

C# 查询运算符测试

测试一下全部的查询运算符。每天测试一部分,代码会持续更新中……C#using System;using System.Collections;using System.Collections.Generic;using System.Linq;using&nb...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。