2016-08-21 55 views
0

我有一个DataGrid绑定到DataTable属性。 数据来自大容量网络。 有没有办法告诉WPF将数据附加到该网格,而无需在每次新数据到达时重新加载现有线路?如何将数据追加到DataGrid?

我试着向DataTable添加新行并调用DataGrid.Items.Refresh(),但实际上您可以看到每次新数据到达时都会重新加载整个数据。

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

你是什么意思_但你实际上可以看到每次新数据到达时重新加载整个数据_?而'DataGrid.Items.Refresh()'只是重绘控件。 – Fabio

+0

@Fabio我的意思是,在添加了几千行之后 - 添加更多的行会导致UI缓慢且无响应,就好像它试图清除现有表并将整个已修改表加载到DataGrid控件一样。我想知道是否有一种方法可以告诉框架现有的线应该保存在控件中,并且只应添加几行文字 – Shmoopy

+0

您如何将数据绑定到网格?如果你使用'ObservableCollection',它*应该*“只是工作”。 – ChrisF

回答

0

如果绑定网格的DataSourceObservableCollection那么当您从收集网格将用于更新添加(或删除)项目。

你的XAML保持几乎相同的:

DataSource="{Binding Results}" 

但是在您的视图模型,你有:

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

,当你读你的数据:

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

是多余的。你应该绑定到其二传手已经OnPropertChanged属性:

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应该实现INotifyPropertyChangedDataGridViewModel实例应该是你DataGridDataContext

MyViewModel如果要在数据网格中添加行,应该使用默认构造函数。