如何绑定到具有未知列数的WPF网格?
我有一个类可以返回列数和列名等,以及将绑定到每一行的项。基本上,我想在不使用数据表的情况下完成DataTable的功能。必须有一个我需要实现的接口或类似的东西。
答案 0 :(得分:1)
如果您的对象(DataContext)实现IEnumerable,则datagrid将能够吸入对象并显示记录。只需将AutoGenerateColumns设置为true,它就会根据您传递的对象为您生成列。
答案 1 :(得分:1)
我最终通过使用SyncFusion网格控件解决了这个问题。我发现内置网格以及市场上的几乎每个网格都非常朝向一行,即从数据库返回的对象。
如果您偏离此模型,则大多数网格变得无用或至少非常难以使用。就我而言,数据库中的每一行代表一个单元格。我对所有网格的关键问题是获取WPF模板以使用未绑定的数据。 SyncFusion网格是我能找到的唯一可以同时使用这两个功能的网格(ubound
数据和数据模板)。
我还发现flexgrid会解决这个问题,虽然在这方面有点难以处理。
答案 2 :(得分:-1)
最佳解决方案是使用Anonymous Types
。它运作完美,请参阅以下概念证明:
<Window x:Class="AnonymousTypes.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Loaded="OnWindowLoaded">
<Grid>
<DataGrid Name="MyDataGrid" ItemsSource="{Binding}" AutoGeneratedColumns="OnMyDataGridAutoGeneratedColumns">
</DataGrid>
</Grid>
</Window>
代码隐藏:
using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
namespace AnonymousTypes
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public class Employee
{
public int Id { get; set; }
public string Code { get; set; }
public string Name { get; set; }
public int Job { get; set; }
public string Address { get; set; }
}
private ObservableCollection<Employee> _empCollection;
private void OnWindowLoaded(object sender, RoutedEventArgs e)
{
// Generate test data
_empCollection =
new ObservableCollection<Employee>
{
new Employee {Id = 234, Code = "E041", Name = "Employee1", Job = 1, Address = "..."},
new Employee {Id = 245, Code = "E701", Name = "Employee2", Job = 3, Address = "..."},
new Employee {Id = 728, Code = "E001", Name = "Employee3", Job = 9, Address = "..."},
new Employee {Id = 663, Code = "E051", Name = "Employee4", Job = 7, Address = "..."},
};
// Notice that here you can chose the column you want,
// and it can be variable with each query depending on your needs
// Just add the columns you need to the anonymous type
DataContext =
(from i in _empCollection
select new {TheCode = i.Code, TheName = i.Name, TheAddress = i.Address }).ToList();
}
private void OnMyDataGridAutoGeneratedColumns(object sender, EventArgs e)
{
// Now you can change the column names as you need
MyDataGrid.Columns[0].Header = "Header 1 [Code]";
MyDataGrid.Columns[1].Header = "Header 2 [Name]";
MyDataGrid.Columns[2].Header = "Header 3 [Address]";
}
}
}
您可以在使用AutoGeneratedColumns
事件完成数据绑定后更改列标题。