我想监听 WPF 元素上 IsEnabled 属性的更改(以便我可以在它更改时运行一些通用代码),而不必在每个窗口/页面中放置大量代码。
我还想避免由于强大的事件侦听器而导致内存泄漏的任何潜在问题。我遇到过一些建议使用弱事件侦听器等的文章,但这对于看起来应该非常简单的事情来说似乎非常复杂。
我不想为了做到这一点而对控件进行子类化,因为我想监听 IsEnabled 更改的几种控件类型(将来可能还会更多)。
有没有人想出一个更整洁的方法来处理这个?
这个问题的一个巧妙的解决方案是创建一个自定义附加属性并设置一个以 IsEnabled 属性作为源的单向绑定:
<Control IsEnabled={Binding IsEnabledProperty}
AttachedProperty={Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, Mode=OneWay}"/>
这允许您处理附加属性的更改处理程序中的常见功能(这可能涉及触发自定义路由事件,因为 IsEnabled 是常规 CLR 事件并且不会冒泡)。
有一个 Control.EnabledChanged 事件