2016-08-21 15 views
0

DataTableのプロパティには、DataGridがバインドされています。 データが大量のネットワークから送信されています。 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私は数千行追加した後、いくつかの行を追加すると、既存のテーブルをクリアして、変更されたテーブル全体をDataGridコントロールにロードしようとしたかのように、UIが鈍く応答しなくなります。私はフレームワークに、既存のラインをコントロールに保存し、わずか数行を追加する必要があることを伝える方法があるかどうか疑問に思っていました。 – Shmoopy

+0

データをグリッドにどのようにバインドしましたか? 'ObservableCollection'を使用する場合は、*ちょうど動作する必要があります*。 – ChrisF

答えて

0

追加(または削除)するとき、あなたのグリッドのDataSourceその後、ObservableCollectionをバインドする場合はアイテムそのコレクションから、グリッドはあなたのために更新されます。

あなたの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}"/> 

ViewModelBaseINotifyPropertyChangedを実装する必要がありますし、DataGridViewModelのインスタンスは、あなたのDataGridDataContextでなければなりません。

MyViewModelには、データグリッドに行を追加する必要がある場合は、デフォルトのコンストラクタが必要です。

関連する問題