2017-01-01 66 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的結合。然後,您可以使用調用的BindingExpression每x秒UpdateTarget()方法DispatcherTimer:

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事件的計時器解決方案可能是最好的選擇。