您可以使用标准的DataGrid 来执行此操作。您可以在 MSDN 上的 DataGrid Class 页面上了解如何使用其中之一。通常在使用这些控件时,您将Bind 自定义数据类型类实例的集合添加到DataGrid.ItemsSource 属性,DataGrid 将为集合中的每个项目添加一行,并为数据中的每个属性添加一列类型类。
由于您希望拥有可变数量的列,这会给您带来问题。但是,您可以使用 .NET 中的 Anonymous Types。这基本上使您能够在运行时定义一个匿名类,以便您可以根据需要定义尽可能多的属性列。您可以在 MSDN 上的Anonymous Types (C# Programming Guide) 页面了解如何使用它们。
我给您的最后一个提示是,您希望在匿名类中拥有string 属性,这些属性提供相关的图像路径,用于在每列中显示您想要的任何图像。然后,您可以声明一个DataTemplate 来定义每个单元格的外观(一个Image)...为此,您的string 文件路径需要采用以下格式-/YourAppName;component/YourImageFolderName/YourImageName.jpg:
<DataGrid ItemsSource="{Binding YourAnonymousTypedCollection}">
<DataGrid.ItemTemplate>
<DataTemplate>
<Image Source="{Binding}" />
</DataTemplate>
</DataGrid.ItemTemplate>
</DataGrid>
您可以从 MSDN 上的 ItemsControl.ItemTemplate Property 和 Data Templating Overview 页面了解更多信息。
以防万一有人不清楚,我还添加了指向 MSDN 上 Anonymous Types (C# Programming Guide) 页面的链接,以便任何不了解的人都可以了解整个故事。因此,您的第一条评论是不必要的,对任何人都没有帮助。
继续您出色的第二条评论,您直截了当地告诉我,我 将无法使用匿名类解决“动态列”问题...这次您只是简单不正确。您真的应该在做出此类声明之前检查这些事情。为了证明我的方法有效,我举了一个简单快捷的例子:
这是DataGrid:
<DataGrid Name="DataGrid" AutoGenerateColumns="True" />
这是我定义我的匿名类型的地方,将它们放在List 和Bind 中,将它们放在DataGrid 中:
var item = new { Id = 1, Name = "Bob", Age = 30 };
var item2 = new { Id = 2, Name = "Jane", Age = 26 };
var item3 = new { Id = 3, Name = "Dave", Age = 42 };
var items = new[] { item, item2, item3 }.ToList();
DataGrid.ItemsSource = items;
然后您可以看到它运行良好。通过创建具有不同数量参数的类型来扩展此示例表明它可以与任意数量的列一起使用:
var item = new { Id = 1, Name = "Bob", Age = 30, Date = DateTime.Now };
var item2 = new { Id = 2, Name = "Jane", Age = 26, Date = DateTime.Now };
var item3 = new { Id = 3, Name = "Dave", Age = 42, Date = DateTime.Now };
var items = new[] { item, item2, item3 }.ToList();
DataGrid.ItemsSource = items;
当然,问题作者可以在循环中声明项目以提高效率。