我目前正在学习WPF,DataContexts和DataBinding.我的目标是使用一个任务栏任务(使用NotifyIconWpf),该任务具有运行后台的连续线程来监视网络.
我设法获得绑定到ProgramClock类的UI元素(显示在屏幕截图中),但是当ProgramClock更改时它不会更新,很可能是因为INotifyPropertyChanged参数中的某些内容是错误的.
我发现最接近的类似问题是UI未更新INotifyPropertyChanged但是我无法弄清楚要在XAML中更改DataPath的内容,或者如何使INotifyPropertyChanged正常工作.
请注意,BackgroundWorker线程成功更新了App的静态ProgramClock(使用单独的WinForm进行检查),并且该时间最初是在WPF中加载的,因此可能没有正确调用PropertyChanged.
ProgramClock
public class ProgramClock : INotifyPropertyChanged { private DateTime _myTime; public event PropertyChangedEventHandler PropertyChanged; private ClockController clockController; public ProgramClock() { this._myTime = DateTime.Now; clockController = new ClockController(); MessageBox.Show("created new clock"); } public DateTime MyTime { get { return this._myTime; } set { if (_myTime == value) return; _myTime = value; //System.Windows.Forms.MessageBox.Show(PropertyChanged.ToString()); if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(_myTime.ToString())); } } public string MyTimeString { get { return this._myTime.ToString(); } } public void UpdateTime() { this.MyTime = DateTime.Now; } }
泡泡CS
public partial class InfoBubble : System.Windows.Controls.UserControl { public InfoBubble() { InitializeComponent(); this.DataContext = App.ClockBindingContainer; } }
泡泡XAML
主要应用
public partial class App : System.Windows.Application { private TaskbarIcon tb; private ResourceDictionary _myResourceDictionary; public static ProgramClock _programClock = new ProgramClock(); private void Application_Startup(object sender, StartupEventArgs e) { NotifIconStarter(); } public static ProgramClock ClockBindingContainer { get { return _programClock; } } }
Daniel Kelle.. 5
一个问题是你调用PropertyChanged
事件.您需要将正在更改的属性的名称传递给PropertyChangedEventArgs
非新值.
所以使用:
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("MyTime"));
代替:
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(_myTime.ToString()));
但是,您实际上是绑定到另一个属性 - MyTimeString
.
最终,您要约束的财产需要举办活动.
一个问题是你调用PropertyChanged
事件.您需要将正在更改的属性的名称传递给PropertyChangedEventArgs
非新值.
所以使用:
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("MyTime"));
代替:
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(_myTime.ToString()));
但是,您实际上是绑定到另一个属性 - MyTimeString
.
最终,您要约束的财产需要举办活动.