You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 14:06:03