使用AutoGenerateColumns </someinterface>从List <someinterface>构建WPF DataGrid

时间:2014-02-23 13:55:56

标签: wpf datagrid

我正在尝试从通用列表中将数据加载到DataGrid。

相关代码:

XAML:

<Grid>
    <DataGrid  DataContext="{Binding Lines}"
               ItemsSource="{Binding}"
               AutoGenerateColumns="True">
    </DataGrid>
</Grid>

C#:

 public IList<IReportLine> Lines { get; set; }
 public interface IReportLine {}
 public class ReportLine : IReportLine
 {
    public string A { get; set; }
    public string B { get; set; }
 }

似乎列是从IReportLine类型中获取的 - 所以我得到一个空的DataGrid。

当然,如果我将IReportLine定义更改为:

public interface IReportLine
{
    string A { get; set; }
    string B { get; set; }
}

它完美无缺,但我不能这样做,因为每个实现IReportLine的类都有不同的属性。

为了使动态类型的IReportLine生成列,我该怎么办? 或者有任何其他想法来解决我的问题?

谢谢!

修改

包含Lines属性的接口和实现接口的类(多个中的一个):

    interface IReport
    {
       string Header { get; set; }
       IList<IReportLine> Lines { get; set; }
    }
    public class Report : IReport
    {
       public string Header
       {
           get;
           set;
       }
       public IList<IReportLine> Lines
       {
           get;
           set;
       }
    }

DataGrid的DataContext是IReport对象。

所以我无法改变

public IList<IReportLine> Lines { get; set; }

public IList<ReportLine> Lines { get; set; }

1 个答案:

答案 0 :(得分:1)

不要在界面中定义成员,而是使列表更加详细。你必须告诉dataGrid至少一些特定类型,以便它可以在其中查找属性。

更改

public IList<IReportLine> Lines { get; set; }

public IList<ReportLine> Lines { get; set; }

<强>更新

就像我上面提到的,如果你想要自动生成列,你必须提供一些特定的类型。

考虑一下您有另一个课程说AnotherReportLine实施IReportLine

的情况
public class AnotherReportLine : IReportLine
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
}

现在,您可以在Lines集合中添加两个类实例,如下所示:

 Lines = new List<IReportLine>();
 Lines.Add(new ReportLine() { A = "A1", B = "B1" });
 Lines.Add(new AnotherReportLine() { A = "A1", B = "B1", C = "C1" });

现在列列表应该是什么?

A | B A | B | C WPF引擎无法在没有您帮助的情况下推断

这会让你了解三种可能的方式:

  • 将属性移至界面。
  • 列出更具体的类型。
  • 上次设置AutoGenerateColumnsFalse,并提供您想要显示的列列表。