Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从抽象类继承静态事件的INotifyPropertyChanged_C#_Wpf_Data Binding - Fatal编程技术网

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

C# 从抽象类继承静态事件的INotifyPropertyChanged,c#,wpf,data-binding,C#,Wpf,Data Binding,我正在尝试为各种硬件实现许多抽象层,我发现我已经实现了相同的功能,NofityStaticPropertyChanged(from)大约5次 /// <summary> /// A slightly different implementation of Static Property Changed, from here: /// https://stackoverflow.com/a/42111290/2444435 /// </summar

我正在尝试为各种硬件实现许多抽象层,我发现我已经实现了相同的功能,
NofityStaticPropertyChanged
(from)大约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));
    }

谢谢!我有一种感觉,我可能无法逃脱这种重复数据消除的尝试,但如果可能的话,那就太棒了

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设置为单例即可。

为什么事件必须是静态的?只要删除static关键字,就有了一个可以扩展的可重用基类。因为我绑定到静态属性。是的,问题是为什么。我一直在使我的工厂是静态的,只是将GUI选择直接绑定到它们。当我实际连接到一个硬件时,工厂返回一个适当类型的对象。我可以从技术上实例化这些工厂,但让它们保持静态似乎会更干净,因为它们除了基于少量选择参数返回对象之外,什么都不做。也许一个单身模式会更好。是的,这基本上就是我正在做的;我使用的静态属性基本上是每个工厂实例化不同类型硬件所需的属性,每个硬件为给定工厂实现一个公共接口。我尽量不在不同的工厂之间复制/粘贴代码;我不想实际实例化它们——我将它们作为一个单例使用。也许我只是通过使用静态属性以一种非理想的方式实现了它。
<TextBlock Text="{Binding Path=(vm:MyStaticClass.MyStaticProperty), Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />