我想在我的应用程序中显示一个倒数计时器,显示持续时间直到某个NodaTime.Instant
。为此,我有以下设计:
public class Event
{
private Instant EventStartTime;
public Duration TimeLeft { get { return EventStartTime - SystemClock.Instance.Now; } }
}
但是当我现在在我看来这样表现时:
<Label Content="{Binding Event.TimeLeft}" />
这不会动态更新。我知道解决方案,我开始一个计时器来连续触发PropertyChangedEvents
,但在这种情况下这似乎有些过分。
是否有一种干净的方式可以始终向用户显示正确的时间?
答案 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中的数据绑定。