从抽象类继承INotifyPropertyChanged的静态事件

时间:2019-04-24 21:51:58

标签: c# wpf data-binding

我正在尝试为各种硬件实现多个抽象层,我发现我已经实现了相同的功能NofityStaticPropertyChanged(来自here)大约5次。

    /// <summary>
    /// A slightly different implementation of Static Property Changed, from here:
    /// https://stackoverflow.com/a/42111290/2444435
    /// </summary>
    public static event PropertyChangedEventHandler StaticPropertyChanged;

    protected static void NotifyStaticPropertyChanged(string propertyName)
    {
        StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
    }

我希望所有这些类都从abstract class AbstractionBase继承以避免重复使用代码。

我已经在其他地方阅读过有关如何为非静态成员继承这种功能的信息,但是我从未真正实例化这些抽象层/工厂。

我不确定这是否确实可行,因为不能继承静态属性。我觉得应该是应该的,因为它基本上是一个函数,而不是一个属性?因此,我目前的尝试是:

public abstract class AbstractionBase : INotifyPropertyChanged
{
    //THIS IS NOT WORKING!
    #region INofity Declarations
    /// <summary>
    /// A slightly different implementation of Static Property Changed, from here:
    /// https://stackoverflow.com/a/42111290/2444435
    /// </summary>
    public static event PropertyChangedEventHandler StaticPropertyChanged;

    protected static void NotifyStaticPropertyChanged(string propertyName)
    {
        StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
    }

    #endregion
} 

谢谢!我觉得我可能无法摆脱这种重复数据删除尝试,但是如果有可能,那就太好了!

1 个答案:

答案 0 :(得分:1)

WPF 4.5支持绑定到静态属性,您要做的就是创建一个具有相同名称的静态事件处理程序,并在其后附加文本“ Changed”,然后调用它而不是StaticPropertyChanged:

public class MyStaticClass
{
    public static event EventHandler MyStaticPropertyChanged;

    private static string _MyStaticProperty = "Hello World!";
    public static string MyStaticProperty
    {
        get { return _MyStaticProperty; }
        set
        {
            if (_MyStaticProperty != value)
            {
                _MyStaticProperty = value;
                MyStaticPropertyChanged?.Invoke(null, EventArgs.Empty);
            }
        }
    }
}

您将这样绑定:

<TextBlock Text="{Binding Path=(vm:MyStaticClass.MyStaticProperty), Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />

不过,老实说,对我来说,这看起来像是一个架构问题。如果您使用的是依赖注入框架,并且应该这样做,那么绝对不需要对任何事物使用静态属性,只需将它们放在自己的类中并设置DI使其成为单例。