【问题标题】:Databinding issue with stopwatched elapsed秒表已过的数据绑定问题
【发布时间】:2011-06-08 19:53:29
【问题描述】:

我正在尝试创建一个类,当它启动时它会启动一个秒表,并且一直将经过的时间写入一个局部变量 Elapsed,我有一个数据绑定到的 Listview。但是当我使用这段代码时,Listview 只显示 00:00:00.00000001 并且永远不会改变。 类的代码是:

命名空间项目23 { 公共类 ActiveEmployee { 公共 int EmpID { 获取;放; } 公共字符串 EmpName { 获取;放; } 私人日期时间日期; 私人 BackgroundWorker 工人; 公共秒表软件; 公共 ActiveEmployee(int empID,字符串 empName) { 日期 = 日期时间。现在; 工人=新的背景工人(); worker.DoWork += 背景工作; worker.WorkerReportsProgress = true; worker.RunWorkerAsync(); } 私人时间跨度过去; 公共时间跨度已过 { 得到{返回过去; } 放 { 经过=价值; NotifyPropertyChanged("Elapsed"); } } 私人无效背景工作(对象发送者,DoWorkEventArgs args) { sw = 新的秒表(); sw.Start(); 如果是真的) { Elapsed = sw.Elapsed; } } 公共事件 PropertyChangedEventHandler PropertyChanged; 私人无效NotifyPropertyChanged(字符串信息) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } } }

现在它可以使用计时器代替

使用系统; 使用 System.ComponentModel; 使用 System.Timers;

命名空间 Eksamen_Januar_2011 { 公共类 ActiveEmployee:INotifyPropertyChanged { 公共 int EmpID { 获取;放; } 公共字符串 EmpName { 获取;放; } 私人日期时间开始日期; 私人 BackgroundWorker 工人; 私人定时器;

public ActiveEmployee(int empID, string empName) { startDate = DateTime.Now; worker = new BackgroundWorker(); worker.DoWork += BackgroundWork; timer = new Timer(1000); timer.Elapsed += TimerElapsed; worker.RunWorkerAsync(); } private TimeSpan elapsed; public TimeSpan Elapsed { get { return elapsed; } set { elapsed = value; NotifyPropertyChanged("Elapsed"); } } private void BackgroundWork(object sender, DoWorkEventArgs args) { timer.Start(); } private void TimerElapsed(object sender, ElapsedEventArgs e) { Elapsed = DateTime.Now - startDate; } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } }

}

【问题讨论】:

    标签: c# .net wpf binding


    【解决方案1】:

    您需要实现 INotifyPropertyChanged 接口。修改你的类声明:

    public class Employee : System.ComponentModel.INotifyPropertyChanged
    

    http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

    【讨论】:

      【解决方案2】:

      数据绑定和观察变化依赖于变化通知事件;通常是*Changed(用于属性*)或INotifyPropertyChanged(尽管可以自定义实现)。

      Stopwatch 不提供此类;您最好使用Timer 来每隔一段时间更新一次用户界面。只需在开始时存储DateTime,每当计时器触发时,计算从那时到现在的偏移量。

      【讨论】:

      • 但是我确实在文件的底部做了 PropertyChanged?所以每当 Elapsed = sw.Elapsed;被调用(这是所有的时间)然后它应该更新控件?
      【解决方案3】:

      使用 if(true) 语句有什么意义?你的意思是写while(true)?

      您只在线程中更新一次经过的时间,然后它就存在了..这就是您在表单上看到的

      【讨论】:

        猜你喜欢
        • 2012-05-10
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        • 2011-01-17
        • 2016-03-12
        相关资源
        最近更新 更多