2016-12-04 17 views
2

私は数日間このことに固執していますが、自分で解決策を見つけることはできません。 ItemsSourceとしてList<Plants>のDataGridを入力しようとしています。複数のレイヤーを持つListでいっぱいのC#DataGrid

"Type1, \n Type2, \n ..." 

:問題は、タイプPlant私はいるICollection内の各項目は、このような新しい行にある文字列としてデータグリッドの対応する列に表示する必要のあるタイプICollection<PlantType>の部材を有しています私は単純化されたコードをここに示します(コード全体をコピーするとそれは少し過度になります)。 PlantTypeTypeカラム(Plantない)を有すること

public partial class Plants 
{ 
    public Plants() 
    { 
     PlantType = new HashSet<PlantType>(); 
    } 

    public int ID { get; set; } 
    public string Name { get; set; } 
    public int Page { get; set; } 

    public virtual ICollection<PlantType> PlantType { get; set; } 
} 

注。今、私はこの情報をデータグリッドを埋めるためにしたいので、理想的には次のようになります:現時点では

----------------------------------------- 
| Name | Page |  Type  | 
|---------------------------------------| 
| plant1 | 3  | supporting  | 
|---------------------------------------| 
| pla2 | 13  | not-supporting | 
|---------------------------------------| 
|   |   | test   | 
|---------------------------------------| 
|   |   | also this type | 
|---------------------------------------| 
|   |   | type   | 
|---------------------------------------| 
| plantZ | 40  | test   | 
----------------------------------------- 

問題であるものはHashSetsないので、それが唯一の名前とページ(に記入し、したがって、明確な)。これは、データグリッドを埋めるための私のコードがどのように見えるかです:私は物事を試してみたが、アイデアやGoogle検索用語が不足している

private void BuildDataGridContent(List<Plants> lList) 
{ 
    dataGrid.IsReadOnly = true; 
    dataGrid.AutoGenerateColumns = false; 
    dataGrid.ItemsSource = lList; 

    DataGridTextColumn textColumn1 = new DataGridTextColumn(); 
    DataGridTextColumn textColumn2 = new DataGridTextColumn(); 
    DataGridTextColumn textColumn3 = new DataGridTextColumn(); 

    textColumn1.Header = "Name"; 
    textColumn1.Binding = new Binding("Name"); 
    textColumn2.Header = "Page"; 
    textColumn2.Binding = new Binding("Page"); 
    textColumn3.Header = "Type"; 
    textColumn3.Binding = new Binding("Type"); // <-- the problem is here. It can't directly access lList.PlantType.Type (PlantType = Table name; Type = column name in the SQL DB) 

    dataGrid.Columns.Add(textColumn1); 
    dataGrid.Columns.Add(textColumn2); 
    dataGrid.Columns.Add(textColumn3); 
} 

。誰かが私が正しくこのようにカラムにTypeを縛る方法を教えてもらえますか?

+0

あなたが望むビューのあなたの例は少し不明です。それぞれの 'Plant'インスタンスの行に、' ICollection 'のそれぞれの' PlantType'インスタンスの行が続くはずですか? – blins

+0

ええ、それは少し不明です、申し訳ありません。つまり、タイプは最初のプラントと同じ行に表示されますが、カンマと改行で区切られます。 "test"の例では、 "このタイプ"と "タイプ"も "サポートしていない"と同じ行にあります(すべてが名前の一部です:pla2)。 さらに明確にするために:Plantname |ページ| planttype(リストは一度に複数あることがあるので) – Vitriol

+0

'Name'と' Page'と同じプロパティとともにstring型の 'Type'のようなプロパティを持つ' PlantViewModel'クラスを作成します。次に、 'Plant'を' PlantViewModel'にマップし、最後にPlantViewModelsにバインドするだけです。 – blins

答えて

0

データモデルタイプ(Plant)に直接バインドするのではなく、各DataGrid行にバインドするためにPlantViewModelタイプを導入するのが合理的に簡単な解決策です。これはもちろん、データモデルにもあるビューモデルのいくつかのプロパティを再定義する必要があります。また、PlantからPlantViewModelへのマッピングロジックを導入し、逆も可能ですが(ビューを編集できる場合)、データモデルとビューの緩やかな結合を促進します。

関連する問題