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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值