Свойство Xamarin.Forms C # не обновляется в Device.StartTimer - PullRequest
0 голосов
/ 15 ноября 2018

Я хочу создать приложение, которое отсчитывает выбранное время.Но у меня странная проблема, и я не знаю, что я делаю неправильно.

Вот мой таймер, он будет вызываться каждый раз, когда изменяется свойство средства выбора.Когда я выбираю время, код удаляет только 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();
            }
        }
    }

Кто-нибудь знает, что я здесь делаю неправильно?

1 Ответ

0 голосов
/ 15 ноября 2018

Таймер работает в другом потоке.Если вы хотите запустить что-то в главном потоке, где находится пользовательский интерфейс, вам нужно использовать метод Device.BeginInvokeOnMainThread().Как это:

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

    i++;
    return true;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...