2017-09-20 1 views
4

バインドされたViewModelを使用してXamarin Formsでストップウォッチ型のアプリケーションを作成しています。コードでは、私が達成しようとしているのは、Viewで "Lap"ボタンを押すとCommandを起動し、ObservableCollectionにオブジェクトを追加してObservableCollectionに追加するメソッドを実行するというものです。ObservableCollectionに追加 - オブジェクト参照エラー

問題は、追加ボタンが実際にコレクションに追加されていないことです。

「System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示されます。この行の

RaceTimings.Add(lap); 

私は間違っていますか?以下の完全なコード。

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; 

     } 
    } 
} 

答えて

6

ただ、このように、コンストラクタであなたの_timingsコレクションを初期化します。

RaceTimings = new ObservableCollection<Timing>(); 

またはフィールドを初期化します。

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

ありがとう!これがトリックでした。もう1つのオプションはまだエラーが発生しました。 RaceTimings =新しいObservableCollection (); –

関連する問題