Проблема привязки данных к секундомеру истекла - PullRequest
4 голосов
/ 14 января 2011

Я пытаюсь создать класс, который при запуске запускает секундомер и все время истекшее время записывается в локальную переменную Elapsed, к которой у меня есть Listview, к которому привязывается база данных.Но когда я использую этот код, Listview просто отображает 00: 00: 00.00000001 и никогда не меняется.Код класса:

namespace project23
{
    public class ActiveEmployee
    {
        public int EmpID { get; set; }
        public string EmpName { get; set; }
        private DateTime date;
        private BackgroundWorker worker;
        public Stopwatch sw;

        public ActiveEmployee(int empID, string empName)
        {
            date = DateTime.Now;
            worker = new BackgroundWorker();
            worker.DoWork += BackgroundWork;
            worker.WorkerReportsProgress = true;

            worker.RunWorkerAsync();
        }

        private TimeSpan elapsed;
        public TimeSpan Elapsed
        {
            get { return elapsed; }
            set
            {
                elapsed = value;
                NotifyPropertyChanged("Elapsed");
            }
        }

        private void BackgroundWork(object sender, DoWorkEventArgs args)
        {
            sw = new Stopwatch();
            sw.Start();
            if(true)
            {
                Elapsed = sw.Elapsed;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
    }
}

Теперь он работает с использованием таймеров вместо

using System;
using System.ComponentModel;
using System.Timers;</p>

<p>namespace Eksamen_Januar_2011
{
    public class ActiveEmployee : INotifyPropertyChanged
    {
        public int EmpID { get; set; }
        public string EmpName { get; set; }
        private DateTime startDate;
        private BackgroundWorker worker;
        private Timer timer;</p>

<code>    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));
        }
    }
}
</code>

}

Ответы [ 3 ]

4 голосов
/ 14 января 2011

Вам необходимо реализовать интерфейс INotifyPropertyChanged.Измените объявление класса:

public class Employee : System.ComponentModel.INotifyPropertyChanged

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

2 голосов
/ 14 января 2011

Привязка данных и наблюдение за изменениями зависит от событий уведомлений об изменениях; *Changed (для свойства *) или INotifyPropertyChanged обычно (хотя возможны пользовательские реализации).

Stopwatch не обеспечивает такое; вам может быть лучше использовать Timer вместо этого, чтобы обновлять пользовательский интерфейс так часто. Просто сохраните DateTime при запуске и всякий раз, когда срабатывает таймер, рассчитайте смещение с этого момента до настоящего момента.

0 голосов
/ 14 января 2011

Какой смысл иметь утверждение if (true)? Вы хотели написать в то время как (правда)?

Вы обновляете истекшее время только один раз в цепочке, а затем оно существует ... что вы видите в форме

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...