为了简单说明我的困境,假设我有以下代码:
class A
{
// May be set by a code or by an user.
public string Property
{
set { PropertyChanged(this, EventArgs.Empty); }
}
public EventHandler PropertyChanged;
}
class B
{
private A _a;
public B(A a)
{
_a = a;
_a.PropertyChanged += Handler;
}
void Handler(object s, EventArgs e)
{
// Who changed the Property?
}
public void MakeProblem()
{
_a.Property = "make a problem";
}
}
为了履行其职责,B 类必须对 A 的 PropertyChanged 事件使用react,但也能够在某些情况下自行更改该属性。不幸的是,其他对象也可以与属性交互。
我需要一个顺序流的解决方案。也许我可以只使用一个变量来禁用一个 Action :
bool _dontDoThis;
void Handler(object s, EventArgs e)
{
if (_dontDoThis)
return;
// Do this!
}
public void MakeProblem()
{
_dontDoThis = true;
_a.Property = "make a problem";
_dontDoThis = false;
}
有没有更好的方法?
其他注意事项
- 我们无法改变 A。
- A 是密封的。
- 还有其他方与 PropertyChanged 事件有关,我不知道他们是谁。但是当我从 B 更新属性时,他们不应该也收到通知。但我无法将他们与事件分开,因为我不认识他们。
- 如果同时有更多线程可以与该属性交互怎么办?
解决的子弹越多越好。
原始问题
我最初的问题是一个 TextBox (WPF),我想根据其内容和焦点对其进行补充。所以我需要对 TextChanged 事件使用react,如果它的起源来 self 的补语,我还需要省略该事件。在某些情况下,不应通知 TextChanged 事件的其他监听器。某些特定状态和样式的字符串对其他字符串不可见。
最佳答案
如果不处理您发起的事件如此重要,也许您应该更改设置属性的方式以包括更改的发起者?
public class MyEventArgs : EventArgs
{
public object Changer;
}
public void SetProperty(string p_newValue, object p_changer)
{
MyEventArgs eventArgs = new MyEventArgs { Changer = p_changer };
PropertyChanged(this, eventArgs);
}
然后在您的处理程序中 - 只需检查您不是发起者。
我发现在多线程和可扩展性方面,注册和成员方面的所有这些变化都非常成问题。
关于c# - 禁用事件处理的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18056645/