如何方便的让你的集合引发改变事件

在我们开发自定义控件的过程中,我们常常会给控件添加集合属性。比如定制Grid控件就会有Column集合。当集合属性发生变化时,比如添加新元素,删除新元素,我们要通知控件去重绘以反映新的变化。我们可以创建一个集合类,在类里添加一个新的事件,并在集合发生变化时触发事件。.Net框架已经为我们提供了现成的委托声明,下面我们来看看怎么使用。
      我创建一个名字叫HeaderCollection的类,派生于System.System.Collections.ObjectModel.Collection<ColumnHeader>。利用.Net已经声明的CollectionChangeEventHandler委托来声明一个事件,如下:      
None.gifpublic delegate void CollectionChangeEventHandler (
None.gif Object sender,
None.gif CollectionChangeEventArgs e
None.gif)
None.gif
CollecionChangeEventArgs的构造函数需要两个参数,一个枚举类型CollectionChangeAction,用它来指出发生了什么变化,包含添加,删除,整个集合发生变化三种动作,第二个参数传递发生变化的元素。
      接下来我们重载Collection<T>的几个方法:InsertItem,ClearItems,RemoveItem在这些方法里触发事件,下边是这个类的完整描述:
      
None.gifusing System;
None.gif
using System.Collections.Generic;
None.gif
using System.Text;
None.gif
using System.Collections;
None.gif
using System.Collections.ObjectModel;
None.gif
using System.ComponentModel;
None.gif
None.gif
namespace CPI.DataProcess.Forms
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif[Serializable]
InBlock.gif
public class HeaderCollection:Collection<ColumnHeader>
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
InBlock.gif
public event CollectionChangeEventHandler ItemChanged;
InBlock.gif
InBlock.gif
public HeaderCollection()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
protected override void InsertItem(int index, ColumnHeader item)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif
InBlock.gif
base.InsertItem(index, item);
InBlock.gifItemChanged(
this,new CollectionChangeEventArgs(CollectionChangeAction.Add,item));
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
protected override void ClearItems()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
base.ClearItems();
InBlock.gifItemChanged(
thisnew CollectionChangeEventArgs(CollectionChangeAction.Refresh, null));
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
protected override void RemoveItem(int index)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
base.RemoveItem(index);
InBlock.gifItemChanged(
thisnew CollectionChangeEventArgs(CollectionChangeAction.Remove, this[index]));
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
protected override void SetItem(int index, ColumnHeader item)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif
InBlock.gif
base.SetItem(index, item);
InBlock.gifItemChanged(
thisnew CollectionChangeEventArgs(CollectionChangeAction.Refresh, null));
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
private void OnItemPropertyChanged(Object sender)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifItemChanged(sender,
null);
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gif

这样我们的Collection就暴露出一个改变事件,在使用它的地方给它添加委托就可以了,例如:
   
None.gifpublic void OnCollectionPropertyChanged(Object sender,CollectionChangeEventArgs e)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifInvalidate();
ExpandedBlockEnd.gif}

None.gif
private HeaderCollection _Headers =new HeaderCollection();
None.gifHeaders.ItemChanged
+=new CollectionChangeEventHandler(OnCollectionPropertyChanged);
None.gif
      当集合属性发生变化时就会触发事件通知自定义控件重绘。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[汇编语言]-第八章 div指令,伪指令dd,dup

1- div除法指令 (1) 除数: 有8位和16位两种,在一个寄存器或内存单元中. (2) 被除数: 默认放在AX和DX或AX中 除数为8位, 被除数为16位, 默认在AX中存放. 除数为16位, 被除数为32位, 在DX或AX中存放. AX存放低16位,DX存放高16位. (3) 结果 除数为8位, 则AL存储除法操作的商, AH存…

lambda表达式浅析【C++学习笔记】

lambda表达式浅析【C学习笔记】 基本用法: auto f [/*捕获列表*/](/*参数*/)->int /*后置返回值类型*/{/** 函数体*/};捕获列表: [] : 不捕获任何变量 [变量名] : 表示值捕获,不可修改 [] :按值捕获所有变量,不可修改 [&] : 按引用捕获可以修改 [this] : 在类中捕…

【Cocos2d-x for WP8 学习整理】(2)Cocos2d-Html5 游戏 《Fruit Attack》 WP8移植版 开源...

【Cocos2d-x for WP8 学习整理】&#xff08;2&#xff09;Cocos2d-Html5 游戏 《Fruit Attack》 WP8移植版 开源 原文:【Cocos2d-x for WP8 学习整理】&#xff08;2&#xff09;Cocos2d-Html5 游戏 《Fruit Attack》 WP8移植版 开源这一阵花了些时间&#xff0c;把 cocos2d-h…

碰撞,处理碰撞,发射 Learn Unreal Engine (with C++)

本文使用打砖块游戏举例 碰撞,处理碰撞 碰撞就相当于一个Actor进入另一个Box中,用这个思路就可以处理碰撞了 OnComponentBeginOverlap 当某些内容开始重叠此组件时调用的事件&#xff0c;例如玩家进入触发器。 **委托 事件 **1 AddDynamic( UserObject, FuncName ) 用于…

传送,条件加速 Learn Unreal Engine (with C++)

本文以吃豆人游戏为例UE4项目: 自制UE4 小游戏 (gitee.com) 传送 pawn进入box触发OnActorBeginOverlap获取目标位置,下一帧将pawn坐标更改为目标位置 首先需要重叠函数与开始重叠事件绑定 OnActorBeginOverlap.AddDynamic(this, &ATeleporterActor::OnOverlapBegin);头文件…

获取摄像机,摄像机切换Learn Unreal Engine (with C++)

摄像机应该是使用最普遍的组件了 获取摄像机,摄像机切换 新建C类(以CameraActor为父类) 将摄像机在地图中放置 头文件声明 virtual void BeginPlay() override;UPROPERTY(EditAnywhere, BlueprintReadWrite)UBoxComponent* OverlapVolume; // 盒体组件,用于检测人物碰撞UPR…

android报错及解决1--Bitmap加载时,报bitmap size exceeds VM budget

报错描述&#xff1a; 用Bitmap加载图片资源时&#xff0c;报错java.lang.OutOfMemoryError: bitmap size exceeds VM budget 原因分析&#xff1a; android系统限制&#xff0c;只给图片分配8M内存&#xff0c;超过就蹦。图片虽然几十K&#xff0c;可能是压缩格式&#xff0c;…

主角的创建与选择 Learn Unreal Engine (with C++)

主角创建有两种方式,本教程以SpaceshipBattle fanxingin/UE4项目 - 码云 - 开源中国 (gitee.com) 1. 新建游戏模式方式 新建一个蓝图类,选择游戏模式基础 在蓝图类的细节中将默认pawn类选择主角的蓝图类 在项目设置->地图和模式->默认模式->默认游戏模式 默认游…

控制`Actor`朝向,运动 Learn Unreal Engine (with C++)

控制Actor的朝向,以及Actor的运动 SpaceshipBattle fanxingin/UE4项目 - 码云 - 开源中国 (gitee.com) 控制Actor朝向鼠标 设置鼠标在游戏中可见 获取玩家控制器鼠标可见设置为true PC Cast<APlayerController>(GetController()); PC->bShowMouseCursor true;获取…

.Net开发人员应该下载的十种必备工具(三)

NDoc 编写代码文档资料几乎总是一项令人畏惧的任务。我所说的不是早期设计文档&#xff0c;甚至也不是更为详细的设计文档&#xff1b;我说的是记录类上的各个方法和属性。NDoc 工具能够使用反射来分析程序集&#xff0c;并使用从 C# XML 注释生成的 XML 自动为代码生成文档资料…

Actor范围内随机生成 Learn Unreal Engine (with C++)

Actor范围内随机生成 Learn Unreal Engine (with C) SpaceshipBattle fanxingin/UE4项目 - 码云 - 开源中国 (gitee.com) Actor范围内随机生成 新建box组件 SpawnArea CreateDefaultSubobject<UBoxComponent>(TEXT("SpawnArea"));RootComponent SpawnArea…

.Net开发人员应该下载的十种必备工具(二)

NUnit NUnit 是为 .NET 框架生成的开放源代码单元测试框架。NUnit 使您可以用您喜欢的语言编写测试&#xff0c;从而测试应用程序的特定功能。当您首次编写代码时&#xff0c;单元测试是一种测试代码功能的很好方法&#xff0c;它还提供了一种对应用程序进行回归测试的方法。NU…

子弹创建及发射 Learn Unreal Engine (with C++)

子弹创建及发射 Learn Unreal Engine (with C) SpaceshipBattle fanxingin/UE4项目 - 码云 - 开源中国 (gitee.com) 子弹的创建 声明: UPROPERTY(EditAnywhere, Category "Fire")TSubclassOf<ABullet> Bullet;实现: //在空组件处生产子弹GetWorld()->…

.Net开发人员应该下载的十种必备工具(一)

用于编写单元测试的 NUnit用于创建代码文档资料的 NDoc用于生成解决方案的 NAnt用于生成代码的 CodeSmith用于监视代码的 FxCop用于编译少量代码的 Snippet Compiler两种不同的转换器工具&#xff1a;ASP.NET 版本转换器和 Visual Studio .NET 项目转换器用于生成正则表达式的 …

旋转根组件 Learn Unreal Engine (with C++)

旋转根组件 Learn Unreal Engine (with C) 在UE4中,根组件是无法旋转定位的,只能够缩放,在一些情况下,我们有旋转根组件的需求 SpaceshipBattle fanxingin/UE4项目 - 码云 - 开源中国 (gitee.com) 旋转根组件 将SceneComponent设为根组件 然后将StaticMeshComponentattach…

2007.2.14 日程安排

公元二零零七年二月十四日&#xff0c;农历腊月二十七&#xff0c;该天尤为特别&#xff0c;乃春节长假之初始。此外&#xff0c;该天将是片地鸳侣&#xff0c;漫天桃花之好时日&#xff0c;于是吾将广纳四方真气&#xff0c;闭关修炼&#xff0c;与世无争。00&#xff1a;00 -…

禁止摄像机跟随`Actor`旋转 Learn Unreal Engine (with C++)

禁止摄像机跟随Actor旋转 Learn Unreal Engine (with C) SpaceshipBattle fanxingin/UE4项目 - 码云 - 开源中国 (gitee.com) 如果直接将摄像机绑定在根组件上,在根组件旋转时,摄像机也会跟着旋转 那么如何让摄像机不跟随根组件旋转,只跟着根组件移动 禁止摄像机跟随根组件…

邮件发送---在.net2003和2005中

smtpClient发邮件错误&#xff1a;不允许使用邮箱名称。 服务器响应为: You are not authorized to send mail, authentication is required 使用smtpClient发送邮件时&#xff0c;经常跑出难以明白的错误。其实主要都和我们申请的免费邮箱有关系。有些邮箱不支持&#xff0c;…