PropertyChanged事件始终为null

Dav*_*ave 36 .net c# wpf binding inotifypropertychanged

我有以下(缩写)xaml:

<TextBlock Text="{Binding Path=statusMsg, UpdateSourceTrigger=PropertyChanged}"/>
Run Code Online (Sandbox Code Playgroud)

我有一个单身人士课程:

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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

StatusMessage testMessage = StatusMessage.GetInstance();
testMessage.statusMsg = "This is a test msg";    
Run Code Online (Sandbox Code Playgroud)

我无法获取文本块来显示测试消息.当我通过调试监视代码时,PropertyChanged始终为null.有任何想法吗?

Dav*_*ave 19

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

 this.DataContext = testMessage;
Run Code Online (Sandbox Code Playgroud)


dan*_*ops 16

我今天碰到了这个,浪费了一些时间,最终弄明白了.我希望这有助于拯救你和他人一些时间.

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

public event EventHandler SomeEventHappened;
Run Code Online (Sandbox Code Playgroud)

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

public event EventHandler SomeEventHappened = delegate { };
Run Code Online (Sandbox Code Playgroud)

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

SomeEventHappened()
Run Code Online (Sandbox Code Playgroud)

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

var eventToRaise = SomeEventHappened;
if( eventToRaise != null )
{
    SomeEventHappened()
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为"检查无效"方法现在是首选方法.我确实尝试初始化事件处理程序,就像在第一种情况下那样,事实上,事件不再为null,但是INotifyPropertyChanged事件没有触发对我正在使用的List <T>的更新.修复是使用INotifyCollectionChanged(请参阅:/sf/ask/2613099401/以了解我遇到此问题的经验). (3认同)

kiw*_*pom 9

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

尝试改变

OnPropertyChanged("StatusMsg");
Run Code Online (Sandbox Code Playgroud)

OnPropertyChanged("statusMsg");
Run Code Online (Sandbox Code Playgroud)

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

  • @IanR我认为它不会是null,因为它,它只是不会更新属性,他声明它甚至没有机会更新,因为它是null (3认同)

luk*_*szk 5

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