勇哥谈谈ObservableCollection观察者集合

勇哥注:

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

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



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

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

image.png

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>创造这种功能。


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

    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} }
        };

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

 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;
            }


触发事件的代码:

 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;
 }


事件函数:

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


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

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

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



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

作者:hackpig

来源:www.skcircle.com

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


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

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

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864