在wpf中静态属性更改时收到通知

时间:2013-12-16 13:24:39

标签: c# wpf

Here 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));
        }
    }

但我不知道在上面的代码中使用什么代替this关键字?

这是我的代码:

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");
    }
}

2 个答案:

答案 0 :(得分:7)

除非使用发送者参数,否则无关紧要。从逻辑上讲,使用类型是有意义的:

handler(typeof(TypeDeclaringEvent), new PropertyChangedEventArgs(PropertyName));

编辑:请注意,在您提到的文档中,它指出:

  

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

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

您的活动不符合这些,这可能是一个问题。

答案 1 :(得分:0)

认为您已将此添加到您的viewmodel:

  yourClass.StaticPropertyChanged+= yourClassStaticPropertyChanged;

...

  void yourClassStaticPropertyChanged(object sender, DependencyPropertyChangedEventArgs e)
        {

        }

“this”关键字引用“object sender”参数。 如果在创建处理程序时在代码中使用“this”,则它会在yourClassStaticPropertyChanged函数中引用“sender”。如果发送null,则sender参数将为null。

- 编辑 -

如果您想要更改文本框,请将此代码添加到您的viewmodel:

private string _updatedText;
public string UpdatedText
{
  get
  {
      return _updatedText;
  }
  set
  {
      _updatedText= value;
      OnStaticPropertyChanged("UpdatedText")
  }
}

并在事件中设置UpdatedText:

void yourClassStaticPropertyChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
                UpdatedText=e.NewValue;
        }

然后将UpdatedText绑定到您的文本框,如下所示:

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