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)
您的OnPropertyChanged字符串必须与属性的名称完全匹配,因为它区分大小写.
尝试改变
OnPropertyChanged("StatusMsg");
Run Code Online (Sandbox Code Playgroud)
至
OnPropertyChanged("statusMsg");
Run Code Online (Sandbox Code Playgroud)
更新:另外 - 只是注意到你绑定到StatusMsg(大写'S'); 所以控件没有绑定到属性,这是它没有更新的另一个原因!
| 归档时间: |
|
| 查看次数: |
59211 次 |
| 最近记录: |