2009-11-13 6 views
6

Ich versuche, eine List an einen DataGrid zu binden. Hier ist der Code-Schnipsel:Binding Datagrid zur Liste in wpf

public class Parson 
{ 
    public string LastName { get; set; } 
    public string FirstName { get; set; } 

    public Parson(string lastName, string firstName) 
    { 
     LastName = lastName; 
     FirstName = firstName; 
    } 
} 

public class Persons : List<Parson> 
{ 
    // Parameterless constructor  
    public Persons() 
    { 
    } 
    public new void Add(Person parson) 
    { 
     base.Add(parson); 
    } 
} 

der Code hinter:

Persons persons = new Persons(); 
persons.Add(new Parson("New","Person"); 
dataGrid1.DataContext = persons; 

XAML:

<my:DataGrid Name="dataGrid1" 
      xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" 
      CanUserAddRows="True" 
      ItemsSource="{Binding}" 
      AutoGenerateColumns="False"> 
    <my:DataGrid.Columns> 
     <my:DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}"/> 
     <my:DataGridTextColumn Header="Last Name" Binding="{Binding Path=LastName}"/> 
    </my:DataGrid.Columns> 
</my:DataGrid> 

Das Ergebnis ist, dass ein leeres Raster angezeigt wird! Wer weiß warum?

+0

XAML: < /my:DataGrid.Columns>

+0

Enthält Ihr Ausgabefenster etwas, das mit dieser Bindung verwandt ist? – andyp

+0

Ihr Code läuft und funktioniert für mich. Wo legen Sie den DataContext des Rasters fest? Ich habe es in Window.Loaded gesetzt. – ArildF

Antwort

1

Versuchen Sie, die Itemssource statt Datacontext und das Setzen einer ItemsSource={Binding} von XAML entfernen. Das mag den Trick machen.

Edit:

Ich habe nur einige Code, den ich schrieb, dass die gleiche Datagrid-Steuerelement (WPF Toolkit) verwendet, und ich in der Tat die Itemssource statt Datacontext gesetzt. Wenn Sie ein Beispiel brauchen, lassen Sie es mich wissen.

+0

Ich habe es versucht. Funktioniert nicht für mich. Bitte geben Sie mir ein Codebeispiel. –

0

In Ihrem Datagrid-Versuch:

ItemsSource="{Binding Path=.}" 

Diese erfolgreich für mich gearbeitet hat.

+0

hat nicht funktioniert für mich ... –

5

Versuchen AutoGenerateColumns = true

5

(Hinweis: Diese Antwort wurde in .NET Framework v4.0 überprüft): Einstellung

Ein einfacher, 4-teiligen Betrieb ...

  • zuerst auf Ihr DataGrid-Steuerelement im XAML-Markup Ich empfehle Ihnen AutoGenerateColumns="False" (Sie sollten in der Lage sein, dies manuell besser zu tun, als sie es automatisch tun können)
  • Sekunde, auf dem gleichen Steuerelement gesetzt ItemsSource="{Binding}", die das Raster informiert, dass es seine Spalten- und Zeilendaten von einer Quelle erhält, die zur Entwurfszeit nicht definiert ist.
  • drittens, konstruieren Sie die Spalten, um zu sehen, wie sie aussehen sollen und für jede Bindung an die Spalte Daten mit etwas wie Binding="{Binding Path=UniqueID}". Beachten Sie, dass der Wert nach Path interpoliert ist, also achten Sie auf Groß- und Kleinschreibung. Für die Liste <> werden Sie als Zielwert vermutlich einen der Eigenschaftsnamen von Objekten in Ihrer Zielliste <> haben. Spülen und wiederholen Sie so oft wie nötig für jede Spalte in Ihrem DataGrid.
  • viertens, stellen Sie in Ihrem Formular code-behind, innerhalb des Konstruktors oder während des Ladens des Formulars oder wo immer es Ihren Anforderungen am besten entspricht, den DataContext Ihres Rasters ein. Dies sollte eine Form ähnlich wie {gridControlName}.DataContext = {target-List<>}

nehmen Wenn das Formular sein Netz sollte von Objekten in der Liste Ihrer <> mit Inhalt automatischen Auffüllen geladen wird.

+1

Ich musste auch sicherstellen, dass alle DataGrid-Spalten auf Klasseneigenschaften verwiesen (zB public int MyColumn {get; set;}) und nicht nur Klassenfelder (zB public int MyColumn;) – Justas

+1

Und das Festlegen der .DataContext -Eigenschaft muss auftreten, nachdem InitializeComponent() aufgerufen wurde – Justas