2013-07-29 15 views
7

私はネイティブスピーカーではないので、私は英語が上手ではありません。私は言語で間違いを犯した場合はお詫び申し上げます:DataTableにWPF DataGridをバインドする

私はC#とWPFで新しく、WPF DataGridをTwoWayのDataTableにバインドしようとしています。今度は、DataGridの値を編集すると、DataTableのデータが正しく変更されます。 DataTableに次のコードを入力しようとすると、

OleDbDataAdapter adapter = new OleDbDataAdapter("a query", (a connection)); 
adapter.Fill(dataTable); 

コードが機能し、DataGridが正常に見えます。しかし、私はこれを試してみる:

dataTable.Rows[0][1] = (some object); 

表示値は変更されません。私は、DataGridの値を次のようにチェックしようとします。

これは問題ありません。私はなぜ表示値がこのようなものなのか疑問に思っています。

ここにXAMLでの私のDataGrid.CellStyleです:

<DataGrid.CellStyle> 
    <Style TargetType="DataGridCell"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="DataGridCell"> 
        <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="{TemplateBinding Background}"> 
         <DataGridDetailsPresenter HorizontalAlignment="Stretch" VerticalAlignment="Center" Content="{TemplateBinding Content}"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <!-- triggers --> 
     </Style.Triggers> 
    </Style> 
</DataGrid.CellStyle> 

私は数日間、この問題に引っかかってきました。助けてくれてありがとう!

+0

あなたがDataGridの列を定義するとき、あなたはのPropertyChanged – Sivakumar

答えて

0

残念ながら、私はDataRow実装INotifyPropertyChangedまたはDataTable道具INotifyCollectionChangedを信じていません。 WPF DataBindingに、元のソース値が変更されたときに更新するように指示するインターフェイスです。したがって、基礎となるDataTableの値を更新すると、Bindingは自動的にリフレッシュされず、変更はDataGridに反映されません。

This linkは、同様の質問を指し、答えを提供します。基本的に、基本データソースの値を変更するときにDataGridを認識して更新する場合は、INotifyPropertyChangedを実装するカスタムオブジェクト/オブジェクトを作成する必要があります。

+1

には、UpdateModeプロパティを設定していることを確認します私の知る限り、WPF下線データビューにし、そうIBindingListViewに結合し、それがすべての通知のもの。これは、の話題のようです – blindmeis

+0

を持っています多くの議論がありますが、[この質問]に対する2番目の回答を見ると(http:// stackoverflow。com/questions/11154381/datagrid-bound-to-datatable-refresh-values)、特に説明されているコメントです。 IBindingListViewインターフェイスは、INotifyPropertyChangedの必要性を置き換えません。 –

+0

また、[このプレゼンテーション](http://es.slideshare.net/EyalV/data-binding-in-depth-presentation)をMVPで見ることもできます.24を指定すると、IBindingListViewコレクション内のアイテムは、 INotifyPropertyChangedを実装します。 –

4

これは動作しますが、多分あなたは、いくつかのより多くの情報に

のviewmodel与えることができます:

public DataTable MyDataTable { get; private set; } 

//ctor 
_ds = new DataSet("Test"); 
this.MyDataTable = _ds.Tables.Add("DT"); 
this.MyDataTable.Columns.Add("First"); 
this.MyDataTable.Columns.Add("Second"); 

this.MyDataTable.Rows.Add("11", "12"); 
this.MyDataTable.Rows.Add("21", "22"); 

//view is updated with this 
public void UpdateTable() 
{ 
    this.MyDataTable.Rows[0][1] = "haha"; 
} 

XAML

<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding MyDataTable}"/> 
4

を私は、このソリューションが動作する場合は非常にわからないが、それは価値があります試してみる。

DataGridDataTableにバインドする代わりに、DataViewにバインドしてみてください。あなたは両方の方法を動作するはずのデータの変更にDataViewあなたの通知と結合すると

DataTable dt = new DataTable(); 
DataView dv = dt.DefaultView; 

ようDefaultViewプロパティを使用してDataTableDataViewに変換することができます。

+0

あなたはdataGrid1.ItemSource = dt.DefaultView; –