2017-06-28 1 views
0

Problem:WPF: Datagrid nicht aktualisiert

Ich suche ein DataGrid zu erstellen, die automatisch als neue Objekte aktualisiert wird in ein ObservableCollection hinzugefügt. Als Prototyp habe ich eine Timer gemacht, die neue, einzigartige Objekte in die ObservableCollection hinzufügt. Die fragliche Klasse erbt von einer benutzerdefinierten ObservableObject Klasse, die von der INotifyPropertyChanged Schnittstelle erbt. Mit Breakpoints kann ich sehen, dass die ObservableCollection Updates, die ObservableObject Klasse aufgerufen wird und setzt die richtigen Werte, aber die DataGrid zeigt nie etwas.

MainWindow.xaml:

<DataGrid Name="dg" ItemsSource="{Binding Path=DataColl, Mode=TwoWay}" > 

</DataGrid> 

MainWindow.xaml.cs:

public partial class MainWindow : Window 
{ 

    public ObservableCollection<DataClass> DataColl = new ObservableCollection<DataClass>(); 
    public MainWindow() 
    { 
     InitializeComponent(); 

     this.DataContext = this; 

     Timer aTimer; 
     aTimer = new Timer(); 
     aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
     aTimer.Interval = 5000; 
     aTimer.Enabled = true; 

    } 
    int index = 0; 
      private void OnTimedEvent(object sender, ElapsedEventArgs e) 
    { 
     DataColl.Add(new DataClass() { ID = index, time = string.Format("{0:HH:mm:ss tt}", DateTime.Now),source="AIS"}); 
     index++; 

    } 


} 

DataClass.cs

public class DataClass : ObservableObject 
{ 
    private int _id; 


    public int ID 
    { 
     get 
     { 
      return _id; 
     } 
     set 
     { 
      SetProperty(ref _id, value); 
     } 
    } 
    public string time { get; set; } 
    public string source { get; set;} 
} 

ObservableObject.cs

public class ObservableObject : INotifyPropertyChanged 
{ 
     public event PropertyChangedEventHandler PropertyChanged; 
  
     protected void OnPropertyChanged([CallerMemberName] string propName = null) 
     { 
         var handler = PropertyChanged; 
         if (handler != null) 
         { 
             handler(this, new PropertyChangedEventArgs(propName)); 
         } 
     } 
  
     protected bool SetProperty<T>(ref T storage, T value, 
         [CallerMemberName] String propertyName = null) 
     { 
         if (Equals(storage, value)) return false; 
         storage = value; 
         OnPropertyChanged(propertyName); 

         return true; 
     } 
} 

Jede Hilfe wird geschätzt!

+0

Ist die 'Threading.Timer'? Wenn dies der Fall ist, müssen Sie [Dispatcher.Invoke (Action oder Lambda);] (https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher (v = vs. 110) .aspx # Bemerkungen) um die Threads zu synchronisieren. – XAMlMAX

Antwort

1

Meiner Meinung nach ist es ziemlich schlecht zu tun this.DataContext = this; Bitte verwenden Sie eine DependencyProperty.

Wie auch immer ich schätze, Sie verwenden die falsche Timer. Bitte gehen Sie mit DispatcherTimer

private DispatcherTimer _Timer = new DispatcherTimer(); 

    private void StartDispatcherTimer() 
     { 
      _Timer = new DispatcherTimer(); 
      _Timer.Interval = new TimeSpan(0, 0, 0, 0, 1000/FPS); 
      _Timer.Tick += new EventHandler(OnTimerTick); 
      _Timer.Start(); 
     } 

Ich denke, u die Idee.

1

Ihre beobachtbaren Sammlung Erklärung ändern als

private ObservableCollection<DataClass> dataColl; 
     public ObservableCollection<DataClass> DataColl 
     { 
      get { return dataColl; } 
      set { dataColl = value; } 
     } 

die Sammlung innerhalb des Konstruktors initialisieren und Ihr Timer-Ereignis als

ändern
 private void OnTimedEvent(object sender, ElapsedEventArgs e) 
      { 
       Dispatcher.Invoke(() => 
       { 
        DataColl.Add(new DataClass() { ID = index, time = string.Format("{0:HH:mm:ss tt}", DateTime.Now), source = "AIS" }); 
        index++; 
       }); 
      } 
+0

Danke, das hat funktioniert! Gibt es eine Chance, dass Sie in diesem Fall erklären können, warum die Sammlung initialisiert wird? – Lacynt

+0

@Lacynt Das Problem ist, dass 'DataColl' eine Eigenschaft sein muss, mit einem 'get'-Block, anstatt einem Feld, wie Sie es hatten. Justin, darf ich vorschlagen, die 'DataColl'-Eigenschaft nur lesend zu machen, weil ihr Setter' PropertyChanged' nicht aufruft und keine Abhängigkeitseigenschaft ist? –

Verwandte Themen