Xamarin.Forms C# property not updating in Device.StartTimer










0















I want to create a app that counts down the selectedtime. But I am having a weird problem and I do not know what I am doing wrong.



Here is my timer, it will be called everytime the property of the picker changes. When I select a time the code only removes 1 second and then it doesn't update anymore.



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;
);

;


I also tried to print a value that kept updating in the value:



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;
);



The value kept increasing, so I know for sure that it is doing something.



This is my modelview:



public class ClockViewModel : BaseViewModel

private TimeSpan selectedTime;

public TimeSpan SelectedTime

get => selectedTime;
set

selectedTime = value;
NotifyPropertyChanged();





Anyone know what I am doing wrong here?










share|improve this question




























    0















    I want to create a app that counts down the selectedtime. But I am having a weird problem and I do not know what I am doing wrong.



    Here is my timer, it will be called everytime the property of the picker changes. When I select a time the code only removes 1 second and then it doesn't update anymore.



    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;
    );

    ;


    I also tried to print a value that kept updating in the value:



    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;
    );



    The value kept increasing, so I know for sure that it is doing something.



    This is my modelview:



    public class ClockViewModel : BaseViewModel

    private TimeSpan selectedTime;

    public TimeSpan SelectedTime

    get => selectedTime;
    set

    selectedTime = value;
    NotifyPropertyChanged();





    Anyone know what I am doing wrong here?










    share|improve this question


























      0












      0








      0








      I want to create a app that counts down the selectedtime. But I am having a weird problem and I do not know what I am doing wrong.



      Here is my timer, it will be called everytime the property of the picker changes. When I select a time the code only removes 1 second and then it doesn't update anymore.



      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;
      );

      ;


      I also tried to print a value that kept updating in the value:



      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;
      );



      The value kept increasing, so I know for sure that it is doing something.



      This is my modelview:



      public class ClockViewModel : BaseViewModel

      private TimeSpan selectedTime;

      public TimeSpan SelectedTime

      get => selectedTime;
      set

      selectedTime = value;
      NotifyPropertyChanged();





      Anyone know what I am doing wrong here?










      share|improve this question
















      I want to create a app that counts down the selectedtime. But I am having a weird problem and I do not know what I am doing wrong.



      Here is my timer, it will be called everytime the property of the picker changes. When I select a time the code only removes 1 second and then it doesn't update anymore.



      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;
      );

      ;


      I also tried to print a value that kept updating in the value:



      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;
      );



      The value kept increasing, so I know for sure that it is doing something.



      This is my modelview:



      public class ClockViewModel : BaseViewModel

      private TimeSpan selectedTime;

      public TimeSpan SelectedTime

      get => selectedTime;
      set

      selectedTime = value;
      NotifyPropertyChanged();





      Anyone know what I am doing wrong here?







      c# mvvm xamarin.forms properties inotifypropertychanged






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 15 '18 at 18:18







      Brum

















      asked Nov 15 '18 at 18:11









      BrumBrum

      314214




      314214






















          1 Answer
          1






          active

          oldest

          votes


















          2














          The timer runs in a different thread. If you want to run something on the main thread, where the UI is, then you have to use the Device.BeginInvokeOnMainThread() method. Like this:



          Device.StartTimer(TimeSpan.FromSeconds(1), () =>

          Device.BeginInvokeOnMainThread (() =>

          clockViewModel.SelectedTime = Picker.Time.Subtract(TimeSpan.FromSeconds(1));
          label.Text = i;
          );

          i++;
          return true;
          );





          share|improve this answer






















            Your Answer






            StackExchange.ifUsing("editor", function ()
            StackExchange.using("externalEditor", function ()
            StackExchange.using("snippets", function ()
            StackExchange.snippets.init();
            );
            );
            , "code-snippets");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "1"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53325536%2fxamarin-forms-c-sharp-property-not-updating-in-device-starttimer%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            2














            The timer runs in a different thread. If you want to run something on the main thread, where the UI is, then you have to use the Device.BeginInvokeOnMainThread() method. Like this:



            Device.StartTimer(TimeSpan.FromSeconds(1), () =>

            Device.BeginInvokeOnMainThread (() =>

            clockViewModel.SelectedTime = Picker.Time.Subtract(TimeSpan.FromSeconds(1));
            label.Text = i;
            );

            i++;
            return true;
            );





            share|improve this answer



























              2














              The timer runs in a different thread. If you want to run something on the main thread, where the UI is, then you have to use the Device.BeginInvokeOnMainThread() method. Like this:



              Device.StartTimer(TimeSpan.FromSeconds(1), () =>

              Device.BeginInvokeOnMainThread (() =>

              clockViewModel.SelectedTime = Picker.Time.Subtract(TimeSpan.FromSeconds(1));
              label.Text = i;
              );

              i++;
              return true;
              );





              share|improve this answer

























                2












                2








                2







                The timer runs in a different thread. If you want to run something on the main thread, where the UI is, then you have to use the Device.BeginInvokeOnMainThread() method. Like this:



                Device.StartTimer(TimeSpan.FromSeconds(1), () =>

                Device.BeginInvokeOnMainThread (() =>

                clockViewModel.SelectedTime = Picker.Time.Subtract(TimeSpan.FromSeconds(1));
                label.Text = i;
                );

                i++;
                return true;
                );





                share|improve this answer













                The timer runs in a different thread. If you want to run something on the main thread, where the UI is, then you have to use the Device.BeginInvokeOnMainThread() method. Like this:



                Device.StartTimer(TimeSpan.FromSeconds(1), () =>

                Device.BeginInvokeOnMainThread (() =>

                clockViewModel.SelectedTime = Picker.Time.Subtract(TimeSpan.FromSeconds(1));
                label.Text = i;
                );

                i++;
                return true;
                );






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 15 '18 at 18:33









                Gerald VersluisGerald Versluis

                17.6k43659




                17.6k43659





























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53325536%2fxamarin-forms-c-sharp-property-not-updating-in-device-starttimer%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    這個網誌中的熱門文章

                    Barbados

                    How to read a connectionString WITH PROVIDER in .NET Core?

                    Node.js Script on GitHub Pages or Amazon S3