2017-08-30 5 views
2

Ich versuche, eine Datentabelle auf einem Datagrid zu binden, um es dynamisch zu füllen. Das Datagrid scheint das Datatable zu finden, denn wenn ich es befülle und nach dem RaisePropertyChanged habe ich viele leere Zeilen. Es gibt auch keine Spalten.DataTable an DataGrid binden. WPF MVVM

Meine Ansicht:

<UserControl x:Class="NWViewer.View.DataGridView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:NWViewer.View" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" 
     DataContext="{Binding DataGrid, Source={StaticResource Locator}}"> 
<Grid> 
    <DataGrid ItemsSource="{Binding oTable.DefaultView}" AutoGenerateColumns="True" ColumnWidth="25"> 
    </DataGrid> 
</Grid> 
</UserControl> 

Meine Viewmodel:

public DataTable oTable { get;set;} 

private void getNewData(List<ElementBaseViewModel> rootElement) 
{  
    oTable.Clear(); 
    foreach (var element in rootElement) 
    { 
     buildFromChildren(element);      
    } 
    RaisePropertyChanged("oTable");     
}   
private void buildFromChildren(ElementBaseViewModel element) 
    { 
     if(element.Children != null) 
     { 
      if (isAttributeChildren(element)) 
      { 
       DataRow oRow = oTable.NewRow(); 
       foreach (var attribute in element.AttributeChildren) 
       { 
        Model.Attribute attr = (Model.Attribute)attribute.Element; 
        if (!oTable.Columns.Contains(attr.name)) 
        oTable.Columns.Add(attr.name); 
        oRow[attr.name] = attr.Value; 
       } 
       oTable.Rows.Add(oRow); 
      } 
      foreach (var elem in element.ElementChildren) 
      { 
       buildFromChildren(elem); 
      } 
     } 
    } 

und dies ist die graphische Rendering:

Datagrid

Aber die Datatable scheint richtig gefüllt, wenn ich es debuggen:

DataTable when debugging

+0

Bitte fügen Sie weitere Informationen hinzu ([siehe MCVE] (https://stackoverflow.com/help/mcve)). Es ist schwer zu helfen, wenn wir nicht wissen, was passiert, z. in 'buildFromChildren' – grek40

Antwort

1

Das Problem ist höchstwahrscheinlich auf die Initialisierung DataTable bezogen, DataGrid wird Spalten automatisch generieren, wenn ein neuer ItemsSource gesetzt ist, aber es wird nicht wieder - Generiert Spalten, wenn nach der Initialisierung Spalten zur zugrunde liegenden Tabelle hinzugefügt werden.

Lösung 1:

alle Spalten auf die Initialisierung des DataTable erstellen, bevor es an die DataGrid verbindlich.

Lösung 2:

Force, um die ItemsSource aufzufrischen. Es sollte so funktionieren, aber ich empfehle Lösung 1 wenn möglich:

var tempTable = oTable; 
oTable = null; 
RaisePropertyChanged("oTable"); 
oTable = tempTable; 
RaisePropertyChanged("oTable"); 
+0

THX BRO. Dies ist die Lösung. Daran habe ich nicht gedacht. Du hast meinen Tag gerettet! – Ant4r

+0

@ Ant4r kein Problem. Wenn das Ihre Frage gelöst hat, sollten Sie die Antwort akzeptieren: https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – grek40

Verwandte Themen