【问题标题】:Implementing INotifyPropertyChanged on a static property in a Singleton?在单例中的静态属性上实现 INotifyPropertyChanged?
【发布时间】:2013-10-03 16:25:56
【问题描述】:

WPF 新手,遇到以下问题:

StatusBarItem 显示一个简单的计时器(自窗口加载以来的秒数)。绑定源属性和支持 DispatcherTimer 位于 Singleton 类中并且是静态的,这似乎是合理的,因为每个应用程序只有一个 StatusBar。该类实现了 INotifyPropertyChanged,因为它是与 StatusBarItem 的单向绑定。

WPF 4.5 可以使用静态事件 (see here) 绑定到静态属性。

这不起作用,因为 INotifyPropertyChanged 不是静态的,所以事件不能是静态的,所以属性不能是静态的。解决方案是保持计时器静态,但使属性不是静态的。

如果静态属性不能依赖 INotifyPropertyChanged,那么在 4.5 中引入对静态属性的绑定有什么意义?是否有 INotifyPropertyChanged 的​​静态版本?我一定错过了什么,但不知道是什么。感谢您的澄清。

【问题讨论】:

    标签: wpf


    【解决方案1】:

    是的,您遗漏了一些东西,您链接到的页面描述了您如何定义通知 WPF 静态属性已更改的事件。

    对于名为 MyProperty 的属性,可以按以下方式创建事件

    public static event EventHandler MyPropertyChanged; 
    

    或称为

    的通用事件
    public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged
    

    InotifyPropertyChanged 仅用于上述命名事件之一的静态属性

    【讨论】:

    • 谢谢。我会责怪那些像咒语一样重复 INotifyPropertyChanged 的​​文档,但从来没有说过要避免静态属性。
    【解决方案2】:

    您不需要实现INotifyPropertyChanged 接口,只需像文档中那样声明事件即可。

    【讨论】:

      【解决方案3】:

      您可以将静态属性包装在实例属性中,但设计是这里真正的问题。为什么在单例中有静态属性?根据定义,一个进程中应该只有一个单例实例,这使得静态属性(而不是保存单例实例的静态属性)毫无意义。

      【讨论】:

      • 公平点。它在 WinForm 世界中作为一个静态类幸福地生活着,由于绑定而不得不成为 WPF 中的单例
      猜你喜欢
      • 2011-06-08
      • 2013-01-14
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      相关资源
      最近更新 更多