PropertyChanged事件始终为null

时间:2009-10-03 02:35:02

标签: c# .net wpf binding inotifypropertychanged

我有以下(缩写)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始终为null。有什么想法吗?

10 个答案:

答案 0 :(得分:18)

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

 this.DataContext = testMessage;

答案 1 :(得分:14)

我今天碰到了这个,浪费了一些时间,最终想通了。我希望这有助于拯救你和他人一段时间。

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

public event EventHandler SomeEventHappened;

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

public event EventHandler SomeEventHappened = delegate { };

当您调用

时,这将确保它不是空引用
SomeEventHappened()

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

var eventToRaise = SomeEventHappened;
if( eventToRaise != null )
{
    SomeEventHappened()
}

答案 2 :(得分:9)

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

尝试更改

OnPropertyChanged("StatusMsg");

OnPropertyChanged("statusMsg");

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

答案 3 :(得分:4)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

当我将现有数据分配给控件的数据绑定属性时,我也看到PropertyChanged事件为null:

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

这在何处起作用:

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

答案 6 :(得分:0)

在将PropertyChanged事件对象视为null时,需要检查几个项目。

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

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

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

    因此,最好将该类实现为单例模式,以便在runt-time时只能确保对象的一个​​实例。

答案 7 :(得分:0)

就我而言,这可以使其工作:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;    // this row fixed everything
    }
    ****
    Some code here with properties etc
    ***
}

答案 8 :(得分:-1)

我遇到了类似的问题,以上解决方案都没有帮助我。 我需要做的就是使用内置的c# P 更改过的属性。 事先,我实现了propertyChanged(由于意外),它什么也没有指向。

答案 9 :(得分:-3)

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