我有一个自定义WPF控件。它有一个典型的DependencyProperty
,我们称之为Status
,它会通过绑定定期更新。 (更具体地说,它绑定到根据INotifyPropertyChanged
发送通知的属性。)
我想实现某种“过期”行为:如果Status
在某段时间内未更新,则会发生某些事情。理想情况下,这个逻辑应该在我的自定义控件内(我有很多实例)。我在DispatcherTimer
更改处理程序中设置Status
并执行我需要的操作。一切都很好。
问题是,Status
通常会更新为相同的值,即实际上并未更改。然而,即使在这种情况下,它也应该重置过期计时器。
即使我强制我的视图模型(实现INotifyPropertyChanged
)在分配时发送通知,无论值是否发生更改,WPF DependencyProperty
实现都足够聪明,可以检查其更改拥有,并且不会调用我在PropertyChangeCallback
注册的Status
(FrameworkPropertyMetadata
)。
最好的办法是什么?
我可以在我的控件中创建另一个DependencyProperty
,我会在分配到Status
时更改(例如,分配一个随机数或翻转bool
),并执行我的计时器处理那里。但这似乎是一种丑陋且非常迂回的方式,特别是使用它。
答案 0 :(得分:0)
只需回答我自己的问题并至少提供一些解决方案,最后我就完成了@Janne的建议。我在int
上创建了一个包装器类,因此每个分配都创建了一个新对象,并因此被视为新对象。 (我没有重写Equals
方法来对Status
进行数值比较,因此DP只能使用对象身份检查。)
不利的一面是,这必然会创建大量的小垃圾(在应用的整个生命周期中,每秒有100多个实时分配),但这并不是问题。尤其是鉴于WPF无论如何都要包装一切。