【问题标题】:Force update notifications for DependencyProperty even when it doesn't change强制更新 DependencyProperty 的通知,即使它没有改变
【发布时间】:2016-12-03 21:23:10
【问题描述】:

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

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

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

即使我强制我的视图模型(实现 INotifyPropertyChanged)发送分配通知,无论值是否更改,WPF DependencyProperty 实现也足够聪明,可以自行检查更改,并且不会调用我注册为StatusPropertyChangeCallback(在FrameworkPropertyMetadata 中)。

最好的办法是什么?

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

【问题讨论】:

  • 如果您的状态是文本,只需创建一个具有文本属性的包装类 Status,并且在更新时始终创建一个新实例。
  • @JanneMatikainen,不,它是一个整数,但它仍然是一个有效的想法......

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


【解决方案1】:

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

不利的一面是,这必然会产生大量的小垃圾(在应用的整个生命周期中每秒有 100 多个实时分配),但这不是问题;尤其是鉴于 WPF 将所有内容都装箱了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2016-02-17
    • 2011-02-20
    • 2018-10-30
    • 2017-03-07
    • 2013-10-07
    • 1970-01-01
    相关资源
    最近更新 更多