我有两个 WPF(标准集)小部件 A 和 B。当我更改 A 的某些属性时,应该在 B 上设置它,当 B 中的属性更改时,应该在 A 上设置它。
现在我有这个丑陋的递归 --> 我更改 A,所以代码更改 B,但由于 B 已更改,它又更改了 A,因此它又更改了 B... 你明白了。
如何避免这种递归是最“标准”的方法?天真地删除和添加事件处理程序无效,并且检查新值是否与旧值相同在这里不适用(由于计算的波动 - 我没有将相同的值设置为 A 和 B,而是转换)。
背景
我总是尝试尽可能少地提供有关问题的信息,以避免混淆。然而,这可能会有所帮助
- 我没有编写那些小部件,我只处理事件,仅此而已 - 尽管标题为“递归触发”,但处理程序是按顺序调用的,因此您有入口-退出-入口-退出-入口-退出的序列,而不是入口-入口-入口-退出-退出-退出 - 最后一个,可能是最不重要的,但仍然存在,在这种特殊情况下,我有一个公共处理程序用于 A 和 B
在这种情况下,A和B是滚动查看器,我试图保持它们的位置成比例地相同。Karin Huber的项目在这里:http://www.codeproject.com/KB/WPF/ScrollSynchronization.aspx 事件触发
阻止事件的想法非常流行,我添加了一系列触发事件的步骤,如下所示:
- 我改变A - 调用A处理程序 - 禁用A的处理程序 - 我更改B(存储但不触发) - 启用A的处理程序 - 现在从队列中获取事件 - 调用B处理程序 - 禁用B的处理程序 - 我更改A - ...
正如您所看到的,这是徒劳的。
现在我有这个丑陋的递归 --> 我更改 A,所以代码更改 B,但由于 B 已更改,它又更改了 A,因此它又更改了 B... 你明白了。
如何避免这种递归是最“标准”的方法?天真地删除和添加事件处理程序无效,并且检查新值是否与旧值相同在这里不适用(由于计算的波动 - 我没有将相同的值设置为 A 和 B,而是转换)。
背景
我总是尝试尽可能少地提供有关问题的信息,以避免混淆。然而,这可能会有所帮助
- 我没有编写那些小部件,我只处理事件,仅此而已 - 尽管标题为“递归触发”,但处理程序是按顺序调用的,因此您有入口-退出-入口-退出-入口-退出的序列,而不是入口-入口-入口-退出-退出-退出 - 最后一个,可能是最不重要的,但仍然存在,在这种特殊情况下,我有一个公共处理程序用于 A 和 B
在这种情况下,A和B是滚动查看器,我试图保持它们的位置成比例地相同。Karin Huber的项目在这里:http://www.codeproject.com/KB/WPF/ScrollSynchronization.aspx 事件触发
阻止事件的想法非常流行,我添加了一系列触发事件的步骤,如下所示:
- 我改变A - 调用A处理程序 - 禁用A的处理程序 - 我更改B(存储但不触发) - 启用A的处理程序 - 现在从队列中获取事件 - 调用B处理程序 - 禁用B的处理程序 - 我更改A - ...
正如您所看到的,这是徒劳的。