C#DataGrid填充了多个图层列表

时间:2016-12-04 15:51:29

标签: c# wpf list binding datagrid

我已经被困在这几天了,我自己找不到解决方案。我正在尝试使用List<Plants>作为ItemsSource填充DataGrid。问题是,类型Plant有一个ICollection<PlantType>类型的成员,我需要在DataGrid的相应列中显示为一个字符串,其中ICollection中的每个项目都在这样的新行上:

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

我将在这里显示简化代码(复制整个代码会过度使用它。)

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

请注意,PlantType包含Type列(不是Plant)。现在我想用这些信息填充DataGrid,理想情况下它看起来像这样:

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

目前的问题是,它只填写名称和页面(因为那些不是HashSets,因此很清楚)。这就是我填充DataGrid的代码的样子:

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绑定到列上吗?

1 个答案:

答案 0 :(得分:0)

一个相当简单的解决方案可能是引入PlantViewModel类型来绑定到每个DataGrid行,而不是直接绑定到您的数据模型类型(Plant)。这当然需要在视图模型中重新定义一些也在数据模型中的属性,并引入从PlantPlantViewModel的映射逻辑,并且可能反过来(如果您的视图是可编辑的)但它会促进数据模型和视图之间的松散耦合。