C# 当wpf中的静态属性更改时收到通知

C# 当wpf中的静态属性更改时收到通知,c#,wpf,C#,Wpf,microsoft在wpf 4.5中描述,我们也可以将INotifypropertyChanged用于静态属性。所以我试着这么做 代码如下: public static event PropertyChangedEventHandler StaticPropertyChanged; protected static void OnStaticPropertyChanged(string PropertyName) { PropertyChangedEventHan

microsoft在wpf 4.5中描述,我们也可以将INotifypropertyChanged用于静态属性。所以我试着这么做

代码如下:

public static event PropertyChangedEventHandler StaticPropertyChanged;
    protected static void OnStaticPropertyChanged(string PropertyName)
    {
        PropertyChangedEventHandler handler = StaticPropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(PropertyName));
        }
    }
但是我不知道在上面的代码中用什么来代替这个关键字

这是我的密码:

public static event PropertyChangedEventHandler StaticPropertyChanged;
protected static void OnStaticPropertyChanged(string PropertyName)
{
    PropertyChangedEventHandler handler = StaticPropertyChanged;
    if (handler != null)
    {
        handler(typeof(MainWindowViewModel), new PropertyChangedEventArgs(PropertyName));
    }
}

private static Haemogram _cHaemogram;
public static Haemogram cHaemogram
{
    get
    {
        return _cHaemogram;
    }
    set
    {
        _cHaemogram = value;
        OnStaticPropertyChanged("cHaemogram");
    }
}
除非有任何东西使用sender参数,否则这无关紧要。从逻辑上讲,使用以下类型是有意义的:

handler(typeof(TypeDeclaringEvent), new PropertyChangedEventArgs(PropertyName));
编辑:请注意,在您提到的文档中,它声明:

静态事件可以使用以下任一签名

   public static event EventHandler MyPropertyChanged;
   public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
您的事件不符合这些要求,这可能是一个问题。

除非有任何内容使用sender参数,否则这无关紧要。从逻辑上讲,使用以下类型是有意义的:

handler(typeof(TypeDeclaringEvent), new PropertyChangedEventArgs(PropertyName));
编辑:请注意,在您提到的文档中,它声明:

静态事件可以使用以下任一签名

   public static event EventHandler MyPropertyChanged;
   public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;

您的事件不符合这些要求,这可能是一个问题。

认为您将此添加到了viewmodel中:

  yourClass.StaticPropertyChanged+= yourClassStaticPropertyChanged;
private string _updatedText;
public string UpdatedText
{
  get
  {
      return _updatedText;
  }
  set
  {
      _updatedText= value;
      OnStaticPropertyChanged("UpdatedText")
  }
}

this关键字引用对象发送者参数。 如果您在创建处理程序时在代码中使用它,它将引用ClassStaticPropertyChanged函数中的发送者。如果发送null,发送方参数将为null

-编辑-

如果要更改文本框,请将以下代码添加到viewmodel:

  yourClass.StaticPropertyChanged+= yourClassStaticPropertyChanged;
private string _updatedText;
public string UpdatedText
{
  get
  {
      return _updatedText;
  }
  set
  {
      _updatedText= value;
      OnStaticPropertyChanged("UpdatedText")
  }
}
并在事件中设置UpdateText:

void yourClassStaticPropertyChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
                UpdatedText=e.NewValue;
        }
然后将UpdateText绑定到文本框,如下所示:

<TextBlock Text="{Binding UpdatedText}"/>

假设您已将此添加到viewmodel中:

  yourClass.StaticPropertyChanged+= yourClassStaticPropertyChanged;
private string _updatedText;
public string UpdatedText
{
  get
  {
      return _updatedText;
  }
  set
  {
      _updatedText= value;
      OnStaticPropertyChanged("UpdatedText")
  }
}

this关键字引用对象发送者参数。 如果您在创建处理程序时在代码中使用它,它将引用ClassStaticPropertyChanged函数中的发送者。如果发送null,发送方参数将为null

-编辑-

如果要更改文本框,请将以下代码添加到viewmodel:

  yourClass.StaticPropertyChanged+= yourClassStaticPropertyChanged;
private string _updatedText;
public string UpdatedText
{
  get
  {
      return _updatedText;
  }
  set
  {
      _updatedText= value;
      OnStaticPropertyChanged("UpdatedText")
  }
}
并在事件中设置UpdateText:

void yourClassStaticPropertyChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
                UpdatedText=e.NewValue;
        }
然后将UpdateText绑定到文本框,如下所示:

<TextBlock Text="{Binding UpdatedText}"/>


我不明白TypeDeclaringEventHe是什么意思,它指的是声明事件的类的名称。@Khushi:无论什么类型声明事件-您的示例代码中没有显示它,所以我猜不出类型名称。@Khushi:是的,但我的意思是在调试中,你是否在检查它是否真的被提出了——你是否得到了那个代码?有人真的订阅了这个活动吗?目前你给我们的信息很少…@Khushi:你误解了创建较小项目的意义。在一个页面上不需要静态属性并不重要,尽管我认为这是一个设计缺陷——你不应该在IMO中使用静态属性——重要的是你要尽可能简单地演示这个问题。恐怕我没有时间继续进一步讨论了。我不明白你说的类型declaringeventhe是什么意思,意思是声明事件的类的名称。@Khushi:无论什么类型声明事件,你都没有在示例代码中显示它,所以我猜不出类型名称。@Khushi:是的,但我的意思是在你的调试中,你是否在检查它是否真的被提出了——你是否得到了那个代码?有人真的订阅了这个活动吗?目前你给我们的信息很少…@Khushi:你误解了创建较小项目的意义。在一个页面上不需要静态属性并不重要,尽管我认为这是一个设计缺陷——你不应该在IMO中使用静态属性——重要的是你要尽可能简单地演示这个问题。恐怕我没有时间继续进一步讨论。不,我没有添加您提到的代码。如果我想添加上述代码,那么我应该在哪里声明代码的第一行?在上述代码中,我应该在花括号之间写些什么?你的目标是什么?您到底想做什么?我已经在MainWindowViewModel的构造函数中使用了您的代码。现在这项活动正在进行中。但更改不会返回到文本框。无论如何,如果你可以帮助,然后我上传了一个演示项目,说明我的问题。你能加入聊天吗?谢谢。我没有尝试您的代码,因为我已将所有viewmodel的代码移到一个viewmodel中。不,我没有添加您提到的代码。如果我想添加上述代码,那么我应该在哪里声明代码的第一行?在上述代码中,我应该在花括号之间写些什么?你的目标是什么?您到底想做什么?我已经在MainWindowViewModel的构造函数中使用了您的代码。现在这项活动正在进行中。但更改不会返回到文本框。无论如何,如果你可以帮助,然后我上传了一个演示项目,说明我的问题。你能加入聊天吗?谢谢。我没有尝试您的代码,因为我已将所有viewmodel的代码移到一个viewmodel中。