2013-07-29 21 views
7

Ich bin nicht gut in Englisch, weil ich kein Muttersprachler bin. Ich entschuldige mich, wenn ich Fehler in der Sprache gemacht habe :)Binden eines WPF DataGrid an eine DataTable

Ich bin neu in C# und WPF und ich versuche, ein WPF DataGrid an eine DataTable in TwoWay zu binden. Wenn ich jetzt die Werte im DataGrid bearbeite, ändern sich die Daten in der DataTable korrekt. Wenn ich versuche, die DataTable mit dem folgenden Code zu füllen:

der Code funktioniert und das DataGrid scheint in Ordnung. Aber wenn ich das versuche:

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

der Anzeigewert ändert sich nicht. Ich versuche, die Werte im DataGrid folgendermaßen zu überprüfen:

und es stellt sich kein Problem heraus. Ich frage mich, warum die Anzeigewerte so sind.

Hier ist meine DataGrid.CellStyle in XAML:

<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> 

Ich habe auf dieses Problem für einige Tage aufgeklebt. Danke für jede Hilfe!

+0

Wenn Sie die Spalte für Datagrid definieren, Achten Sie darauf, die Updatemode-Eigenschaft auf Property – Sivakumar

Antwort

0

Leider glaube ich nicht die DataRow implementiert INotifyPropertyChanged oder die DataTable implementiert INotifyCollectionChanged. Dies sind die Schnittstellen, die einem WPF DataBinding mitteilen, dass es aktualisiert werden soll, wenn sich der zugrunde liegende Quellwert ändert. Wenn Sie also die zugrunde liegenden DataTable Werte aktualisieren, wird die Binding nicht automatisch aktualisiert und die Änderung wird nicht in Ihrem DataGrid widergespiegelt.

This link verweist auf eine ähnliche Frage und liefert eine Antwort. Wenn Sie möchten, dass Ihre DataGrid erkennt und aktualisiert, wenn Sie Werte in der zugrunde liegenden Datenquelle ändern, müssen Sie ein benutzerdefiniertes Objekt/Objekte erstellen, die INotifyPropertyChanged implementieren.

+1

setzen afaik wpf zum unterstreicht Dataview ist verbindlich und so zu einem IBindingListView und so hat sie alle Mitteilung Zeug – blindmeis

+0

Dieses von einem Thema zu sein scheint viel Debatte, aber wenn Sie die zweite Antwort auf [diese Frage] (http: // stackoverflow.com/questions/11154381/datagrid-to-datatable-not-refreshing-values), und speziell die Kommentare, die es erklärt. Die IBindingListView-Schnittstelle ersetzt nicht die Notwendigkeit von INotifyPropertyChanged. –

+0

Sie können auch [diese Präsentation] (http://es.slideshare.net/EyalV/data-binding-in-depth-presentation) von einem MVP betrachten, 24, es besagt, dass die Elemente in der IBindingListView-Auflistung müssen implementieren Sie INotifyPropertyChanged. –

4

Dies funktioniert, können Sie vielleicht ein paar mehr Infos

Ansichtsmodell geben:

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

Ich bin nicht ganz sicher, ob diese Lösung funktioniert, aber es ist ein Wert Versuchen.

Anstatt Ihre DataGrid an eine DataTable zu binden, versuchen Sie, sie an eine DataView zu binden. Sie können Ihre DataTable zu einem DataView mit DefaultView Eigenschaft wie

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

Auf Bindung mit DataView Ihre Mitteilung an Änderungen in Daten umwandeln sollte in beide Richtungen funktionieren.

+0

Sie haben Recht als dataGrid1.ItemSource = dt.DefaultView; –

Verwandte Themen