2016-05-21 3 views
1

Ich habe zwei Klassen, Player und Scorecard. Scorecard verfügt über eine Reihe von Eigenschaften. Player verfügt auch über Eigenschaften, von denen eines ein Scorecard-Objekt ist. Ich habe dann eine Reihe von Spielern. Wie richte ich ein WPF-Datagrid ein, um in jeder Zeile einen Player mit der Eigenschaft Player Name in der ersten Spalte, aber die Eigenschaften aus dem Scorecard-Objekt des Players in den anderen Zeilen anzuzeigen?Binding-Objekt innerhalb von Objekteigenschaften in ein WPF DataGrid

Hier sind die Klassen ...

class Scorecard 
    { 
     public Scorecard() 
     {   
     } 

     // Properties 
     public int Horses { get; set; } = -1; 
     public int Sheep { get; set; } = -1; 
     public int Cows { get; set; } = -1; 
    } 

class Player 
    { 
     public Player(int playerId, string playerName) 
     { 
      ID = playerId; 
      Name = playerName; 
      Scorecard = new Scorecard(); 
     } 

     // Parameters 
     public int ID { get; } 
     public string Name { get; } 
     public Scorecard Scorecard; 
    } 

und das ist, was ich hoffe, zu erreichen (die ASCII-Grafiken zu entschuldigen, ich habe nicht genug Ruf Punkte ein Bild zu schreiben!) .. .

| Name | Horses | Sheep | Cows | 
| Pete | 12  | 2  | 4  | 
| Lucy | 2  | 8  | 14 | 

Ich habe gesucht und kann keine Lösung finden, die ganz richtig ist. Der folgende Code ruft die erste Spalte ab, aber es wird in das zugehörige Scorecard-Objekt gegraben, das ich nicht ausarbeiten kann.

 var col = new DataGridTextColumn(); 
     var binding = new Binding("Name"); 
     col.Binding = binding; 
     dgScoreGrid.Columns.Add(col); 
     dgScoreGrid.ItemsSource = playerArray; 

Antwort

0

erste Sache ist Scorecard ein Eigenschaft (nicht Feld)

// Parameters 
// ... 
public Scorecard Scorecard { get; } 

und als nach Binding Path Syntax, Subproperties einer Immobilie machen kann durch eine ähnliche Syntax wie in C# angegeben werden .

var col = new DataGridTextColumn(); 
var binding = new Binding("Name"); 
col.Binding = binding; 
dgScoreGrid.Columns.Add(col); 

dgScoreGrid.Columns.Add(new DataGridTextColumn{Binding = new Binding("Scorecard.Horses")}); 

dgScoreGrid.ItemsSource = playerArray; 
+0

Vielen Dank, das ist der Trick gemacht. Ich hatte diese Syntax tatsächlich ausprobiert, aber ich hatte nicht erkannt, dass sie nur für Eigenschaften gilt, nicht für Felder. –