【问题标题】:Get notified when static property changes in wpf当 wpf 中的静态属性更改时收到通知
【发布时间】:2016-12-30 02:37:27
【问题描述】:

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

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    除非有任何东西使用 sender 参数,否则没关系。从逻辑上讲,使用该类型是有意义的:

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

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

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

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

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

    【讨论】:

    • 我不明白TypeDeclaringEvent是什么意思
    • 他的意思是声明这个的类的名字。
    • @Khushi:无论声明事件的类型是什么——您还没有在示例代码中显示它,所以我猜不出类型名称。
    • @Khushi:是的,但我的意思是在您的调试中,您是否正在检查它是否真的被提升了——您是否正在获取该代码?有什么东西真的订阅了这个事件吗?目前你给我们的信息很少……
    • @Khushi:您误解了创建较小项目的意义。仅在一个页面上不需要需要静态属性并不重要(尽管我会说这是一个设计缺陷 - 你不应该为该 IMO 使用静态属性) -尽可能简单地说明问题很重要。恐怕我没有时间继续这个讨论了。
    【解决方案2】:

    认为您已将此添加到您的视图模型中:

      yourClass.StaticPropertyChanged+= yourClassStaticPropertyChanged;
    

    ...

      void yourClassStaticPropertyChanged(object sender, DependencyPropertyChangedEventArgs e)
            {
    
            }
    

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

    --编辑--

    如果您想更改文本框,请将此代码添加到您的视图模型中:

    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}"/>
    

    【讨论】:

    • 不,我没有添加你提到的代码。如果我想添加上面的代码,那么(1)我应该在哪里声明你的代码的第一行? (2) 上面代码中的大括号之间应该写什么?
    • 你的目标是什么?你到底想做什么?
    • 我在 MainWindowViewModel 的构造函数中使用了你的代码。现在该事件正在被提出。但是更改不会返回到 TextBox。无论如何,如果您能提供帮助,那么我已经上传了一个演示项目来说明我的问题。 drive.google.com/file/d/0Bw2XAE1EBI6rTVRkSUNBUWpNbFE/…
    • 谢谢。我没有尝试过您的代码,因为我已将所有视图模型的代码移动到一个视图模型中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 2011-06-30
    相关资源
    最近更新 更多