2017-01-01 3 views
2

Я хочу показать таймер обратного отсчета в моем приложении, отображая продолжительность до определенного NodaTime.Instant. Для этого у меня есть следующая конструкция:Показать оставшееся время в wpf

public class Event 
{ 
    private Instant EventStartTime; 
    public Duration TimeLeft { get { return EventStartTime - SystemClock.Instance.Now; } } 
} 

Но когда я теперь показать, как это, на мой взгляд:

<Label Content="{Binding Event.TimeLeft}" /> 

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

Есть ли чистый способ всегда показывать правильное время, оставшееся до пользователя?

ответ

0

Вам нужно либо поднять событие PropertyChanged для свойства TimeLeft, когда вы хотите обновить ярлык. Для этого необходимо, чтобы класс Event реализовал событие INotifyPropertyChanged.

Другой вариант заключается в явном обновлении привязки с использованием BindingExpression. Затем вы можете использовать DispatcherTimer, который вызывает метод UpdateTarget() из BindingExpression каждые х секунд:

public MainWindow() 
{ 
    InitializeComponent(); 

    System.Windows.Threading.DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer(); 
    timer.Interval = TimeSpan.FromSeconds(1); 
    timer.Tick += (s, e) => 
    { 
     var be = theLabel.GetBindingExpression(Label.ContentProperty); 
     if (be != null) 
      be.UpdateTarget(); 
    }; 
    timer.Start(); 
} 

<Label x:Name="theLabel" Content="{Binding Event.TimeLeft}" /> 

Там нет уборщик способ освежить связывание данных в WPF.

1

WPF полагается на механизмы, уведомляющие об этом, когда изменяется свойство, два свойства зависимостей или события INotifyPropertyChanged.

В вашем примере свойство Content присваивается его первоначальному значению привязкой. Однако, поскольку привязка никогда не уведомляется о том, что значение свойства изменилось, оно никогда не обновляется.

Следовательно, решение таймера с событиями PropertyChanged, вероятно, является лучшим вариантом.

Смежные вопросы