在wpf中显示剩余时间

时间:2017-01-01 12:25:00

标签: c# wpf user-interface c#-4.0

我想在我的应用程序中显示一个倒数计时器,显示持续时间直到某个NodaTime.Instant。为此,我有以下设计:

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

但是当我现在在我看来这样表现时:

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

这不会动态更新。我知道解决方案,我开始一个计时器来连续触发PropertyChangedEvents,但在这种情况下这似乎有些过分。

是否有一种干净的方式可以始终向用户显示正确的时间?

2 个答案:

答案 0 :(得分:1)

WPF依赖于在属性更改时通知它的机制,两者是依赖项属性或INotifyPropertyChanged事件。

在您的示例中,Content属性通过绑定设置为它的初始值。但是,由于从未通知绑定属性值已更改,因此它永远不会更新。

因此,具有PropertyChanged事件的计时器解决方案可能是最佳选择。

答案 1 :(得分:0)

每当您希望Label更新时,您需要为TimeLeft属性引发PropertyChanged事件。这需要Event类来实现INotifyPropertyChanged事件。

另一个选项是使用BindingExpression显式更新绑定。然后,您可以使用DispatcherTimer每隔x秒调用BindingExpression的UpdateTarget()方法:

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中的数据绑定。