首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理顺序调用事件处理程序?

如何处理顺序调用事件处理程序?
EN

Stack Overflow用户
提问于 2011-05-22 15:09:59
回答 3查看 428关注 0票数 1

在我重新发明轮子之前..。

这只是一个描述问题的示例 --假设您有一个后端来收集一些数据,而前端显示了集合中的一个项。

在后端我有ItemIndex --每当它改变时,它就会触发OnScroll事件。

我还有AddNewItem方法,它在集合的末尾添加了新的项。该方法的结束是调用OnNewItem事件处理程序。

这是一个陷阱--在AddNewItem中,我必须更改ItemIndex,这会触发OnScroll。两者的接受者之一(!)OnScroll和OnNewItem如果前端显示选定的项目。

在这种情况下,它被称为两次(不好)。一种解决方案是改变item_index而不是ItemIndex,这样可以防止OnScroll,但我不喜欢它,因为ItemIndex不再充当黑匣子。

是否存在连续触发事件的既定模式,并且只发送“重要”事件(此处: OnNewItem覆盖OnScroll)?我的想法是定义一个事件范围,然后不再直接发送事件,只需注册它们以进行发送,在范围结束时对它们进行排序并发送所需的事件。

一般来说-- 问题 --我应该如何处理潜在的顺序事件触发。使用内部设备来避免发送冗余事件?忽视头顶?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-22 16:06:18

对我来说,答案似乎是显而易见的,尽管我很容易错过一些东西:

代码语言:javascript
运行
复制
private bool IsAdding { get; set; }
private int item_index;
private IList m_collection;

public void AddNewItem(object item)
{
    if (item == null)
    {
        throw new Exception("Cannot add null item."); // little bit of contracting never hurts
    }

    m_collection.Add(item);
    IsAdding = true;
    ItemIndex = collection.Count - 1; //I'm just making assumptions about this piece but it is not important how you decide what your index is to answer the question

    if (OnNewItem != null)
    {
       OnNewItem(this, EventArgs.Empty); 
    }
}

public int ItemIndex
{
   get { return item_index =; }
   set
   {
       item_index = value;
       if (!IsAdding && OnScroll != null) //won't double fire event thanks to IsAdding
       {
           OnScroll(this, EventArgs.Empty);
       }
       IsAdding = false; //need to reset it
   }
}

我要注意的一点是,您只提到了直接更改item_index,但这不会有黑箱行为。黑匣子很好很好..。但这个术语只适用于与我们讨论过的这个类交互的对象。

您应该感到有权使用您的类内部的内部元素。它不是一个好的OOP黑盒项目本身。如果您正在这样做,那么您的类可能存在设计问题,应该将其划分为多个类。

票数 2
EN

Stack Overflow用户

发布于 2011-05-22 16:17:27

一种解决方案是使用某种形式的“闩锁”。更新时,您可以通过一个助手执行UI操作,该助手设置一个标志,上面写着“嘿,我处于一个特殊的状态!”然后,在引发事件时,检查锁锁是否已设置--如果是,则跳过引发这些事件。

这基本上是马修发布的一个非常简单、概括的版本。视情况而定,设置国旗可能是远远不够的。

杰里米·米勒的解释值得一读

票数 2
EN

Stack Overflow用户

发布于 2011-05-22 15:19:57

您可以将两个事件都指向单个函数。该函数可以确定发送方并执行适当的操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6088795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档