2017-09-20 3 views
4

Ich erstelle eine Stoppuhr-App mit Xamarin Forms mit einem gebundenen ViewModel. In dem Code versuche ich, wenn ich einen "Lap" -Knopf in der Ansicht drücke, wird ein Befehl ausgelöst, der eine Methode ausführt, die einem Objekt eine Menge Details hinzufügen soll, die dann zu einer ObservableCollection hinzugefügt werden.Hinzufügen zu ObservableCollection - Objektreferenz Fehler

Das Problem, das ich habe, ist, fügt die Schaltfläche Hinzufügen nicht wirklich zur Sammlung hinzu.

Ich bekomme den Fehler "System.NullReferenceException: Objektreferenz nicht auf eine Instanz eines Objekts festgelegt." in dieser Zeile

RaceTimings.Add(lap); 

Was mache ich falsch? Der vollständige Code unten.

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; 

     } 
    } 
} 

Antwort

6

initialisieren Sie Ihre _timings Sammlung im Konstruktor wie folgt aus:

RaceTimings = new ObservableCollection<Timing>(); 

Oder initialisieren das Feld:

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

Dank! Das war der Trick. Die andere Option ist immer noch fehlerhaft. RaceTimings = neue ObservableCollection (); –

Verwandte Themen