我正在尝试从通用列表中将数据加载到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; }
答案 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引擎无法在没有您帮助的情况下推断。
这会让你了解三种可能的方式:
AutoGenerateColumns
至False
,并提供您想要显示的列列表。