2016-08-21 5 views
0

Ich habe eine DataGrid gebunden an eine DataTable Eigenschaft. Die Daten stammen aus dem Netzwerk in Bulks. Gibt es eine Möglichkeit, WPF mitzuteilen, dass Daten an dieses Raster angehängt werden, ohne jedes Mal, wenn neue Daten eintreffen, die vorhandenen Zeilen neu zu laden?Wie fügt man Daten an DataGrid an?

Ich habe versucht, neue Zeilen in die DataTable und DataGrid.Items.Refresh() aufrufen, aber Sie können tatsächlich sehen, dass die gesamten Daten jedes Mal neu geladen wird, wenn neue Daten eintreffen.

XAML:

<Grid> 
    <dg:DataGrid ItemsSource="{Binding MyDataTable} x:name="MyDataGrid"/> 
</Grid> 

C#:

void NewDataArrived() 
{ 
    foreach (var line in NewData) 
    { 
     MyDataTable.Rows.Add(line); 
    } 
    MyDataGrid.Items.Refresh(); 
} 
+0

Was Sie mit _bedeuten, aber Sie können tatsächlich sehen, dass die ganzen Daten jedes Mal neu geladen werden, wenn neue Daten eintreffen? Und 'DataGrid.Items.Refresh()' nur Steuerelement neu zeichnen. – Fabio

+0

@Fabio Ich meine, dass nach ein paar tausend Zeilen hinzugefügt wurden - Hinzufügen von ein paar mehr Zeilen macht die UI träge und reagiert nicht, als ob es versucht, die vorhandene Tabelle zu löschen und die gesamte geänderte Tabelle auf das Steuerelement DataGrid laden. Ich habe mich gefragt, ob es eine Möglichkeit gibt, dem Framework mitzuteilen, dass die vorhandenen Zeilen im Steuerelement verbleiben sollen und nur ein paar Zeilen hinzugefügt werden sollten. – Shmoopy

+0

Wie haben Sie Ihre Daten an das Grid gebunden? Wenn Sie eine 'ObservableCollection' verwenden, sollte * * * einfach funktionieren. – ChrisF

Antwort

0

Wenn Sie Ihr Grids binden DataSource zu einem ObservableCollection dann, wenn Sie hinzufügen (oder entfernen) Elemente aus dieser Sammlung das Raster für Sie aktualisieren.

Ihre XAML bleibt praktisch gleich:

DataSource="{Binding Results}" 

Aber in Ihrer Ansicht nach Modell Sie haben:

public ObservableCollection<DataType> Results 
{ 
    get { ... } 
    set { ... } 
} 

und wenn Sie lesen Ihre Daten:

Results = new ObservableCollection(queryResults); 
0
MyDataGrid.Items.Refresh(); 

ist überflüssig. Sie sollten auf eine Eigenschaft binden, die in seiner Setter OnPropertChanged hat:

public class DataGridViewModel : ViewModelBase 
    { 
    private ObservableCollection<MyViewModel> _source; 
     public ObservableCollection<MyViewModel> Source 
     { 
      get { return _source; } 
      set 
      { 
       _source= value; 
       OnPropertyChanged(); 
      } 
     } 
} 

XAML:

<DataGrid Grid.Row="4" 
       Grid.Column="0" 
       Grid.ColumnSpan="7" 
       AutoGenerateColumns="False" 
       ItemsSource="{Binding Path=Source, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

ViewModelBase sollte implementieren INotifyPropertyChanged und Instanz von DataGridViewModel sollte DataContext Ihrer DataGrid sein.

MyViewModel sollte Standardkonstruktor haben, wenn Sie Zeile in Ihrem Datenraster hinzufügen möchten.

Verwandte Themen