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!
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