在我重新发明轮子之前..。
这只是一个描述问题的示例 --假设您有一个后端来收集一些数据,而前端显示了集合中的一个项。
在后端我有ItemIndex --每当它改变时,它就会触发OnScroll事件。
我还有AddNewItem方法,它在集合的末尾添加了新的项。该方法的结束是调用OnNewItem事件处理程序。
这是一个陷阱--在AddNewItem中,我必须更改ItemIndex,这会触发OnScroll。两者的接受者之一(!)OnScroll和OnNewItem如果前端显示选定的项目。
在这种情况下,它被称为两次(不好)。一种解决方案是改变item_index而不是ItemIndex,这样可以防止OnScroll,但我不喜欢它,因为ItemIndex不再充当黑匣子。
是否存在连续触发事件的既定模式,并且只发送“重要”事件(此处: OnNewItem覆盖OnScroll)?我的想法是定义一个事件范围,然后不再直接发送事件,只需注册它们以进行发送,在范围结束时对它们进行排序并发送所需的事件。
一般来说-- 问题 --我应该如何处理潜在的顺序事件触发。使用内部设备来避免发送冗余事件?忽视头顶?
发布于 2011-05-22 16:06:18
对我来说,答案似乎是显而易见的,尽管我很容易错过一些东西:
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黑盒项目本身。如果您正在这样做,那么您的类可能存在设计问题,应该将其划分为多个类。
发布于 2011-05-22 16:17:27
一种解决方案是使用某种形式的“闩锁”。更新时,您可以通过一个助手执行UI操作,该助手设置一个标志,上面写着“嘿,我处于一个特殊的状态!”然后,在引发事件时,检查锁锁是否已设置--如果是,则跳过引发这些事件。
这基本上是马修发布的一个非常简单、概括的版本。视情况而定,设置国旗可能是远远不够的。
杰里米·米勒的解释值得一读
发布于 2011-05-22 15:19:57
您可以将两个事件都指向单个函数。该函数可以确定发送方并执行适当的操作。
https://stackoverflow.com/questions/6088795
复制相似问题