2013-07-29 205 views
7

我不擅長英語,因爲我不是母語的人。我很抱歉,如果我在語言中犯了錯誤:)將WPF DataGrid綁定到DataTable

我是新的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中的值:

MessageBox.Show((SomeDataGrid.Items[0] as DataRowView).Row[1].ToString()); 

而且事實證明沒有問題。我想知道爲什麼顯示值是這樣的。

下面是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中列,請確保您的UpdateMode屬性設置爲的PropertyChanged – Sivakumar

回答

0

不幸的是,我不認爲DataRow執行INotifyPropertyChangedDataTable執行INotifyCollectionChanged。這些是指示WPF DataBinding在底層源值更改時進行更新的界面。因此,當您更新底層DataTable值時,Binding不會自動刷新,更改將不會反映在DataGrid中。

This link指向一個類似的問題,並提供了一個答案。基本上,如果您希望DataGrid在更改基礎數據源中的值時識別並更新,則需要創建一個實現INotifyPropertyChanged的自定義對象/對象。

+1

AFAIK WPF被綁定到強調數據視圖,因此到IBindingListView,所以它具有所有通知的東西 – blindmeis

+0

這似乎是一個話題很多辯論,但如果你看看[這個問題]的第二個答案(http:// stackoverflow。com/questions/11154381/datagrid-bound-to-datatable-not-refreshing-values),特別是解釋它的註釋。 IBindingListView接口不會取代INotifyPropertyChanged的需要。 –

+0

您也可以通過24位MVP查看[此演示文稿](http://es.slideshare.net/EyalV/data-binding-in-depth-presentation),它聲明IBindingListView集合中的項目必須實現INotifyPropertyChanged。 –

4

這個工作,也許你可以給一些更多的信息

視圖模型:

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

我不是很肯定,如果這個解決方案會工作,但它是值得嘗試。

而不是將您的DataGrid綁定到DataTable,嘗試將其綁定到DataView。您可以使用DefaultView財產轉換您DataTableDataView

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

在有DataView您的通知綁定到數據的變化應該是雙向的。

+0

你是正確的dataGrid1.ItemSource = dt.DefaultView; –