42

我有以下(缩写)xaml:

<TextBlock Text="{Binding Path=statusMsg, UpdateSourceTrigger=PropertyChanged}"/>

我有一个单例类:

public class StatusMessage : INotifyPropertyChanged
{   
    private static StatusMessage instance = new StatusMessage();

    private StatusMessage() { }

    public static StatusMessage GetInstance()
    {
        return instance;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string status)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(status));
        }
    }

    private string statusMessage;
    public string statusMsg
    {
        get
        {
            return statusMessage;
        }
        set
        {
            statusMessage = value;
            OnPropertyChanged("statusMsg");
        }
    }
}

在我的主窗口构造函数中:

StatusMessage testMessage = StatusMessage.GetInstance();
testMessage.statusMsg = "This is a test msg";    

我无法让文本块显示测试消息。当我通过调试监控代码时,PropertyChanged 始终为空。有任何想法吗?

4

10 回答 10

21

谢谢杰罗姆!一旦我设置了 DataContext,它就开始正常工作了!出于测试目的,我将以下内容添加到主窗口构造函数中:

 this.DataContext = testMessage;
于 2009-10-03T03:58:43.520 回答
16

我今天遇到了这个问题,浪费了一些时间,最终弄明白了。我希望这有助于为您和其他人节省一些时间。

如果您的事件没有订阅者,并且您只需将事件声明为:

public event EventHandler SomeEventHappened;

然后是空引用。解决这个问题的方法是声明如下:

public event EventHandler SomeEventHappened = delegate { };

这将确保当您调用时它不是空引用

SomeEventHappened()

我见过的另一种模式是初始化委托 {} 而是检查 null:

var eventToRaise = SomeEventHappened;
if( eventToRaise != null )
{
    SomeEventHappened()
}
于 2011-03-31T06:53:15.077 回答
9

您的 OnPropertyChanged 字符串必须与属性名称完全匹配,因为它区分大小写。

尝试改变

OnPropertyChanged("StatusMsg");

OnPropertyChanged("statusMsg");

更新:另外 - 刚刚注意到您绑定到 StatusMsg (capital 'S'); 所以控件没有绑定到属性,这是它没有更新的另一个原因!

于 2009-10-03T02:38:28.250 回答
5

以防万一:我遇到了类似的问题,但我的错误是实现 INotifyPropertyChanged 的​​类是私有的。公开解决了我的问题。

于 2013-12-04T22:22:10.907 回答
4

就我而言,这使它起作用:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;    // this row fixed everything
    }
    ****
    Some code here with properties etc
    ***
}
于 2019-04-01T03:21:28.023 回答
1

I also have seen the PropertyChanged event be null when I have existing data assigned to the control's data bound property:

<TextBlock Name="CarTireStatus" Text="{Binding TireStatus}" >Bad Text!</TextBlock>

Where as this works:

<TextBlock Name="CarTireStatus" Text="{Binding TireStatus}" ></TextBlock>
于 2015-02-15T15:01:37.637 回答
1

另一点 - 要让 PropertyChanged 为空,请确保将对象绑定到 DataContext,然后设置 Path 而不是直接将属性分配给 UI 字段。

于 2013-10-16T18:49:59.487 回答
0

当将 PropertyChanged 事件对象观察为 null 时,需要检查几项。

  1. 确保引发事件时作为参数传入的属性名称实际上与您所定位的属性的名称匹配。

  2. 确保您只使用包含您要绑定的属性的对象的一个​​实例。

对于第二项,这可以通过简单地在类构造函数上放置一个断点来完成,该对象包含被绑定的属性。如果断点被多次触发,那么您就会遇到问题,需要将对象实例的数量解析为您的运行时通过 XAML 调用的仅一个实例。

因此,最好将该类实现为单例模式,这样您就可以确保在运行时只有一个对象实例。

于 2010-11-15T01:20:01.957 回答
-1

我有一个类似的问题,上面的解决方案都没有帮助我。我需要做的就是使用内置的 c# P ropertychanged。事先我已经实现了propertyChanged(偶然)并且它没有指向任何东西。

于 2020-03-31T17:55:59.230 回答
-3

如果您遵循所有说明,验证您的属性名称是否正确,它是否正确分配了一个新值,您正在使用单例来保证您的视图模型的一个实例,并且您已在 UI 中成功分配了您的 DataContext - 确保在可视化树完成后,强制您的属性更新的任何事情都会完成,即将您的属性的刷新移动到一个按钮,而不是说您的窗口的 Loaded 事件。我这样说是因为我遇到了同样的问题,并且发现当我从 Infragistics NetAdvantage 功能区窗口的 Loaded 事件刷新视图模型数据属性时,我的 PropertyChanged 事件始终为空。

于 2011-01-26T11:15:27.543 回答