强制更新DependencyProperty的更新通知,即使它没有更改

时间:2016-07-29 08:29:26

标签: .net wpf custom-controls dependency-properties

我有一个自定义WPF控件。它有一个典型的DependencyProperty,我们称之为Status,它会通过绑定定期更新。 (更具体地说,它绑定到根据INotifyPropertyChanged发送通知的属性。)

我想实现某种“过期”行为:如果Status在某段时间内未更新,则会发生某些事情。理想情况下,这个逻辑应该在我的自定义控件内(我有很多实例)。我在DispatcherTimer更改处理程序中设置Status并执行我需要的操作。一切都很好。

问题是,Status通常会更新为相同的值,即实际上并未更改。然而,即使在这种情况下,它也应该重置过期计时器。

即使我强制我的视图模型(实现INotifyPropertyChanged)在分配时发送通知,无论值是否发生更改,WPF DependencyProperty实现都足够聪明,可以检查其更改拥有,并且不会调用我在PropertyChangeCallback注册的StatusFrameworkPropertyMetadata)。

最好的办法是什么?

我可以在我的控件中创建另一个DependencyProperty,我会在分配到Status时更改(例如,分配一个随机数或翻转bool),并执行我的计时器处理那里。但这似乎是一种丑陋且非常迂回的方式,特别是使用它。

1 个答案:

答案 0 :(得分:0)

只需回答我自己的问题并至少提供一些解决方案,最后我就完成了@Janne的建议。我在int上创建了一个包装器类,因此每个分配都创建了一个新对象,并因此被视为新对象。 (我没有重写Equals方法来对Status进行数值比较,因此DP只能使用对象身份检查。)

不利的一面是,这必然会创建大量的小垃圾(在应用的整个生命周期中,每秒有100多个实时分配),但这并不是问题。尤其是鉴于WPF无论如何都要包装一切。