【发布时间】:2015-02-05 22:55:40
【问题描述】:
在 OnPropertyChanged() 期间,PropertyChanged 事件始终为 NULL,因此该事件永远不会被调用。我错过了什么?
这是 XML 代码:
<ProgressBar x:Name="ProgressBar1" Value="{Binding PBarValue, UpdateSourceTrigger=PropertyChanged}" Width="200" Height="20" Minimum="0" Maximum="100"></ProgressBar>
C#代码:
public PBar progress_bar = new PBar();
public class PBar : INotifyPropertyChanged
{
private int _progress;
public int progress
{
get { return _progress; }
set
{
if (value != _progress)
{
_progress = value;
OnPropertyChanged("PBarValue");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
private void Main_Initialized(object sender, EventArgs e)
{
ProgressBar1.DataContext = progress_bar;
progress_bar.progress=75; // This does call the set and
// OnPropertyChanged but
// PropertyChanged is always null
// so it never updates UI
}
我正在从另一个线程设置进度条的“值”,所以这就是我需要绑定的原因。
我已经尝试了这么多不同的方法,此时我的头在旋转!
【问题讨论】:
-
不管可能的多线程问题:您正在为属性
PBarValue触发PropertyChanged事件,这将导致绑定通过反射查找属性PBarValue的值。但是,您似乎没有该名称的属性。绑定无法知道您是否希望它检索progress属性的值,如果这是您想要的。 -
PBarValue 是 XML 中绑定语句中 value 属性的名称。这不正确吗?
-
绑定中指示的属性名称必须与对象中的实际属性名称相匹配,因此可以绑定任何内容。目前,它没有。