Xamarin中Timer绑定后UI数值未更新的问题如何解决?
问题核心原因
- 你的
Timer类未实现INotifyPropertyChanged接口,.NET MAUI/Xamarin.Forms 的数据绑定系统无法感知到Time属性的取值发生了变化,因此不会主动触发UI刷新 System.Timers.Timer的Elapsed事件运行在后台线程池线程中,哪怕触发属性变更通知,也需要调度到UI线程执行,否则会出现跨线程访问UI异常或者通知无效
修复方案
首先让Timer类继承INotifyPropertyChanged接口,实现属性变更通知逻辑,同时调整seconds递减的逻辑,每次变更后触发Time属性的变更通知:
using System.ComponentModel; using System.Runtime.CompilerServices; // MAUI/Xamarin.Forms 环境需要引入对应命名空间使用MainThread类 public partial class Timer : ContentView, INotifyPropertyChanged { private int seconds = 30; private System.Timers.Timer timer; public event PropertyChangedEventHandler PropertyChanged; // 属性变更通知方法 protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public Timer() { InitializeComponent(); timer = new System.Timers.Timer(); timer.Interval = 1000; timer.AutoReset = true; timer.Elapsed += new System.Timers.ElapsedEventHandler(OneSecondPassed); timer.Enabled = true; } private void OneSecondPassed(object source, System.Timers.ElapsedEventArgs e) { // 调度到UI线程执行变更逻辑 MainThread.BeginInvokeOnMainThread(() => { seconds--; // 通知绑定系统Time属性已更新 OnPropertyChanged(nameof(Time)); }); } public string Time { get => seconds.ToString(); } }
你现有的XAML绑定逻辑没有问题,不需要修改。
补充说明
.NET跨平台UI框架的数据绑定机制默认依赖INotifyPropertyChanged接口的PropertyChanged事件,只有当属性主动抛出该事件时,绑定目标(也就是你的Label控件)才会收到更新通知,刷新显示内容。
另外你也可以直接用MAUI/Xamarin.Forms自带的DispatcherTimer替代System.Timers.Timer,它的Tick事件默认运行在UI线程,不需要手动做线程调度,代码会更简洁。
内容的提问来源于stack exchange,提问作者youngcoder126
相关产品推荐
相关产品推荐

