2017-09-20 6 views
4

Je crée une application de type Chronomètre avec Xamarin Forms en utilisant un ViewModel lié. Dans le code, ce que j'essaie d'accomplir, c'est quand j'appuie sur un bouton "Lap" dans la commande View it fires a Command, qui exécute une méthode qui devrait ajouter un tas de détails à un objet, qu'il ajoute ensuite à une ObservableCollection.Ajout à ObservableCollection - Référence de l'objet Erreur

Le problème que j'ai, c'est que le bouton Ajouter n'est pas réellement ajouté à la collection. J'ai l'erreur "System.NullReferenceException: Référence d'objet non définie sur une instance d'un objet." sur cette ligne

Qu'est-ce que je fais mal? Code complet ci-dessous.

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Diagnostics; 
using System.Linq; 
using System.Timers; 
using System.Windows.Input; 
using TechsportiseApp.Models; 
using Xamarin.Forms; 

namespace TechsportiseApp.ViewModels 
{ 
    public class TimerViewModel : INotifyPropertyChanged 
    { 

     public Timer myTimer = new Timer(); 

     public ICommand StartTimerCommand { get; set; } 
     public ICommand LapCommand { get; set; } 

     public TimerViewModel() 
     { 
      StartTimerCommand = new Command(StartTimer); 
      LapCommand = new Command(LapButton); 

      LapPosition = 1; 
     } 

     //TimeSpan _elapsedTime; 
     //public TimeSpan ElapsedTime 
     //{ 
     // get {    
     //  return _elapsedTime; 
     // } 
     // set 
     // { 
     //  if (_elapsedTime == value) 
     //   return; 

     //  _elapsedTime = value; 
     //  OnPropertyChanged("ElapsedTime"); 
     // } 
     //} 

     string _elapsedTime; 
     public String ElapsedTime 
     { 
      get 
      { 
       //if(ElapsedTime == "") 
       //{ 
       // _elapsedTime = "00:00:00.00"; 
       //} 
       return _elapsedTime; 
      } 
      set 
      { 
       if (_elapsedTime == value) 
        return; 

       _elapsedTime = value; 
       OnPropertyChanged("ElapsedTime"); 
      } 
     } 

     DateTime _currentTime; 
     public DateTime CurrentTime 
     { 
      get { return _currentTime; } 
      set 
      { 
       if (_currentTime == value) 
        return; 

       _currentTime = value; 
       OnPropertyChanged("CurrentTime"); 
      } 
     } 

     DateTime _raceStartTime; 
     public DateTime RaceStartTime 
     { 
      get { return _raceStartTime; } 
      set 
      { 
       if (_raceStartTime == value) 
        return; 

       _raceStartTime = value; 
       OnPropertyChanged("StartTime"); 
      } 
     } 

     DateTime _lapTime; 
     public DateTime LapTime 
     { 
      get { return _lapTime; } 
      set 
      { 
       if (_lapTime == value) 
        return; 

       _lapTime = value; 
       OnPropertyChanged("LapTime"); 
      } 
     } 

     ObservableCollection<Timing> _timings; 
     public ObservableCollection<Timing> RaceTimings 
     { 
      get 
      { 
       //var sortedtimings = new ObservableCollection<Timing>(_timings.OrderBy(c => c.Position)); 
       return _timings; 
      } 
      set 
      { 
       if (_timings != value) 
       { 
        _timings = value; 
        OnPropertyChanged("Timings"); 
       } 
      } 
     } 

     int _lapPosition; 
     public int LapPosition 
     { 
      get { return _lapPosition; } 
      set 
      { 
       if (_lapPosition == value) 
        return; 

       _lapPosition = value; 
       OnPropertyChanged("LapPosition"); 
      } 
     } 



     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      var changed = PropertyChanged; 
      if (changed != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     void StartTimer() 
     { 
      myTimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent); 
      myTimer.Interval = 10; // 1000 ms is one second 
      myTimer.Start(); 
      RaceStartTime = DateTime.Now; 
      //ElapsedTime = myTimer.Elapsed.Milliseconds() += new ElapsedEventHandler(DisplayTimeEvent); 
     } 

     void DisplayTimeEvent(object source, ElapsedEventArgs e) 
     { 
      TimeSpan _elapsed; 
      _elapsed = e.SignalTime - RaceStartTime; 

      string hours = _elapsed.Hours.ToString().PadLeft(2, '0'); 
      string minutes = _elapsed.Minutes.ToString().PadLeft(2, '0'); 
      string seconds = _elapsed.Seconds.ToString().PadLeft(2, '0'); 
      int _hundredths = _elapsed.Milliseconds/10; 

      string hundredths = _hundredths.ToString().PadLeft(2,'0'); 
      _elapsedTime = hours + ":" + minutes + ":" + seconds + "." + hundredths; 
      ElapsedTime = _elapsedTime; 
      OnPropertyChanged("ElapsedTime"); 
      var RaceTimings = new ObservableCollection<Timing>(); 
     } 

     void LapButton() 
     { 
      var lap = new Timing 
      { 
       Id = 0, 
       RaceId = 0, 
       StartTime = RaceStartTime, 
       EndTime = DateTime.Now, 
       Position = LapPosition, 
       Status = 0 
      }; 
      RaceTimings.Add(lap); 
      LapPosition = LapPosition + 1; 
      var listcheck = RaceTimings.Count; 

     } 
    } 
} 

Répondre

6

votre collection Juste initialize _timings dans le constructeur, comme celui-ci:

RaceTimings = new ObservableCollection<Timing>(); 

ou en initialisant le terrain:

ObservableCollection<Timing> _timings = new ObservableCollection<Timing>(); 
+0

Merci! C'est ce qui a fait l'affaire. L'autre option est toujours erronée. RaceTimings = new ObservableCollection (); –