c# - 禁用事件处理的设计模式

标签 c# wpf design-patterns

为了简单说明我的困境,假设我有以下代码:

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/

相关文章:

c# - Linq to entities 无法识别方法 system.string get_Item

c# - 在 C# foreach 条件中放入查询的效率

c# - 如何将 C# 函数指针传递给 CLI/C++ 代码?

c# - 如何将 Windows 窗体元素发送到 wpf 应用程序的后面?

java - 策略模式和命令模式的区别

c# - List<T> 的这种用法是奇迹还是一团糟

c# - 如何在代码后面说 XAML <Button Height ="Auto"/>?

c# - 模型更改更新 View-Model WPF

c# - 使用委托(delegate)在 C# 中实现的观察者模式?

state-pattern - 状态模式可以帮助处理只读状态吗?