Отображение текущего времени с непрерывным отображением в WPF с использованием MVVM - PullRequest
1 голос
/ 06 декабря 2011

Я хочу отображать текущее время на моем экране с постоянным обновлением на экране WPF с использованием шаблона MVVM.

Я пишу этот код в моей модели просмотра

// creating a property
private string _currentDateTime;
public string CurrentDateTime
{
    get
    {
        return _currentDateTime;
    }
    set
    {
        if (value != _currentDateTime)
        {
            _currentDateTime = value;
            this.RaisePropertyChanged(() => this.CurrentDateTime);
        }
    }
}

и я написал этот метод

 public string GetCurrentDateTime()
 {
     try
     {
         DispatcherTimer timer = new DispatcherTimer(new TimeSpan(0, 0, 1), 
             DispatcherPriority.Normal, 
             delegate
             {
                 this.CurrentDateTime = DateTime.Now.ToString("HH:mm:ss");
             },
             this.Dispatcher);

             return CurrentDateTime;
     }
     catch
     {
         return CurrentDateTime;
     }
}

Я связал свой текстовый блок со свойством, но он показывает исключение, так как this.CurrentDateTime это null.

Любое предложение, почему?

Ответы [ 2 ]

2 голосов
/ 06 декабря 2011

Я не уверен, каково ваше намерение с RaisePropertyChanged(() => this.CurrentDateTime).

Если вы хотите позаботиться об уведомлениях об изменении свойства MVVM, то этот код должен быть в вашей виртуальной машине

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

тогда ваш набор должен быть

set
{
    if (value != _currentDateTime)
    {
        _currentDateTime = value;
        OnPropertyChanged("CurrentDateTime");
    }
}

, чтобы постоянно обновлять ваше время, используйте Timer

Затем вы можете установить интервал, равный 1 секунде, и на каждом прошедшем таймере установить свой CurrentDateTime

CurrentDateTime = DateTime.Now.ToString();
0 голосов
/ 06 декабря 2011

Я не уверен, почему возникает эта проблема, но я достиг той же функциональности с этим, но небольшим изменением кода.

Я изменил код в try блоке *1004* метода

try
{
    DispatcherTimer dispatcherTimer = new  System.Windows.Threading.DispatcherTimer();
    dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
    dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
    dispatcherTimer.Start();

    return CurrentDateTime;
}

и с этим я добавил новый метод для таймера

private void dispatcherTimer_Tick(object sender, EventArgs e)
{
    // Updating the Label which displays the current second
    this.CurrentDateTime = DateTime.Now.ToString(" HH:mm tt");

    // Forcing the CommandManager to raise the RequerySuggested event
    CommandManager.InvalidateRequerySuggested();
}

Теперь он работает

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