首页 > 解决方案 > Xamarin.Forms C# 属性未在 Device.StartTimer 中更新

问题描述

我想创建一个对选定时间进行倒计时的应用程序。但我有一个奇怪的问题,我不知道我做错了什么。

这是我的计时器,每次选择器的属性更改时都会调用它。当我选择一个时间时,代码仅删除 1 秒,然后不再更新。

Picker.PropertyChanged += (sender, e) =>
            {
                if (e.PropertyName == TimePicker.TimeProperty.PropertyName)
                {
                    Device.StartTimer(TimeSpan.FromSeconds(1), () =>
                    {
                        clockViewModel.SelectedTime = Picker.Time.Subtract(TimeSpan.FromSeconds(1));
                        return true;
                    });
                }
            };

我还尝试打印一个在值中不断更新的值:

public int i = 0;

        private void StartTimer()
        {
            Device.StartTimer(TimeSpan.FromSeconds(1), () =>
            {
                clockViewModel.SelectedTime = Picker.Time.Subtract(TimeSpan.FromSeconds(1));
                label.Text = i;
                i++;
                return true;
            });
        }

价值不断增加,所以我确定它正在做某事。

这是我的模型视图:

public class ClockViewModel : BaseViewModel
    {
        private TimeSpan selectedTime;

        public TimeSpan SelectedTime
        {
            get => selectedTime;
            set
            {
                selectedTime = value;
                NotifyPropertyChanged();
            }
        }
    }

有人知道我在这里做错了什么吗?

标签: c#mvvmxamarin.formspropertiesinotifypropertychanged

解决方案


计时器在不同的线程中运行。如果你想在 UI 所在的主线程上运行某些东西,那么你必须使用该Device.BeginInvokeOnMainThread()方法。像这样:

Device.StartTimer(TimeSpan.FromSeconds(1), () =>
{
    Device.BeginInvokeOnMainThread (() => 
    {
        clockViewModel.SelectedTime = Picker.Time.Subtract(TimeSpan.FromSeconds(1));
        label.Text = i;
    });

    i++;
    return true;
});

推荐阅读