C# 将DataGrid绑定到具有自定义对象类型列的DataTable
我有DataTable,我正在尝试将DataGrid与DataTable绑定。但是我的列不是简单类型,它们是自定义对象C# 将DataGrid绑定到具有自定义对象类型列的DataTable,c#,wpf,mvvm,datagrid,datatable,C#,Wpf,Mvvm,Datagrid,Datatable,我有DataTable,我正在尝试将DataGrid与DataTable绑定。但是我的列不是简单类型,它们是自定义对象 public class Node { public string Name { get; set; } public int Id { get; set; } public Node(string name, int id) { Name = name;
public class Node
{
public string Name { get; set; }
public int Id { get; set; }
public Node(string name, int id)
{
Name = name;
Id = id;
}
}
public class NodeBool
{
public bool Name { get; set; }
public int Id { get; set; }
public Node(bool name, int id)
{
Name = name;
Id = id;
}
}
<DataGrid Name="data1" AutoGenerateColumns="True" ItemsSource="{Binding MyDataTable}" />
这些列在执行之前是未知的。它们在运行时基于列表而已知,ad list用于在数据表中添加列
当我将其绑定到datagrid时,列下的每一行都会显示完整的类名。我想将其绑定到类属性,并根据属性复选框bool或textbox显示字符串
我遵循MVVM模型。您必须在下面提到的代码中使用
public class NodeBool
{
public bool Name { get; set; }
public int Id { get; set; }
public NodeBool(bool name, int id)
{
Name = name;
Id = id;
}
}
然后您必须声明ObservableCollection,如下所示
private ObservableCollection<NodeBool> _MyData=new ObservableCollection<NodeBool>();
public ObservableCollection<NodeBool> MyData
{
get { return _MyData; }
set { _MyData = value; RaisePropertyChanged("MyData"); }
}
你的数据网格看起来像
<DataGrid ItemsSource="{Binding MyData}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridCheckBoxColumn MinWidth="150" Header="Name" Binding="{Binding Name}"/>
<DataGridTextColumn MinWidth="180" Header="Id" Binding="{Binding Id}"/>
</DataGrid.Columns>
</DataGrid>
你能做的就是像这样修改你的代码
<DataGrid Name="data1" AutoGenerateColumns="True" ItemsSource="{Binding Path=.}" />
//for循环使用反射获取对象的所有属性
dataTable.Columns.Additem.Name
//用于获取dataTable中所有信息的for循环
DataRow dr;
//像这样添加每个值
dr=dataTable.NewRow
dr[propertyName]=object.propertyName
dataTable.Rows.Add(dr);
dataTable.AcceptChanges();
//然后将该表绑定到datagrid
data1.ItemSource = dataTable.DefaultView
或
确切的代码库如下所示
这里我假设您的信息源是typeNode类的类列表,它将把它转换成相应的dataTable并显示datagrid
public void ConvertListToDataTable()
{
DataTable dt = new DataTable();
Node obj = new Node();
//here obj is instance of your node type
foreach (var item in obj.GetType().GetProperties())
{
dt.Columns.Add(item.Name);
}
List<Node> objDetails = new List<Node>();
Node objNode = new Node();
objNode.Name = true;
objNode.Id = "Test B";
Node objNode1 = new Node();
objNode1.Name = false;
objNode1.Id = "Test B 1";
objDetails.Add(objNode);
objDetails.Add(objNode1);
DataRow dr;
for (int i = 0; i < objDetails.Count; i++)
{
dr = dt.NewRow();
foreach (var item in obj.GetType().GetProperties())
{
dr[item.Name] = objDetails[i].GetType().GetProperty(item.Name).GetValue(objDetails[i], null);
}
dt.Rows.Add(dr);
}
dt.AcceptChanges();
data1.ItemsSource = dt.DefaultView;
}
我需要使用我的数据表。我的DataTable列是根据用户输入决定的,可以是任意数量。因此,它们应该在运行时创建,而不是在XAML中提及。我的意思是,我的DataTable列声明如下:MyDataTable.Columns.Addxyz,typeofNodeBool,在该列中,我需要一个复选框来显示propert NodeBool.name。在这个方法中,我将属性作为元素添加到行中。我需要添加对象作为一个整体,因此,当我从Datatable中获取它时,我也应该能够获取Id属性。我添加了新的精确代码,这可能会对您有所帮助,并且它使用了反射,因此在将来,任何数量的属性都会添加到节点类中,它将自动处理,并将显示在前端,无需手动编码。
data1.ItemSource = dataTable.DefaultView
data1.DataContext = dataTable;
public void ConvertListToDataTable()
{
DataTable dt = new DataTable();
Node obj = new Node();
//here obj is instance of your node type
foreach (var item in obj.GetType().GetProperties())
{
dt.Columns.Add(item.Name);
}
List<Node> objDetails = new List<Node>();
Node objNode = new Node();
objNode.Name = true;
objNode.Id = "Test B";
Node objNode1 = new Node();
objNode1.Name = false;
objNode1.Id = "Test B 1";
objDetails.Add(objNode);
objDetails.Add(objNode1);
DataRow dr;
for (int i = 0; i < objDetails.Count; i++)
{
dr = dt.NewRow();
foreach (var item in obj.GetType().GetProperties())
{
dr[item.Name] = objDetails[i].GetType().GetProperty(item.Name).GetValue(objDetails[i], null);
}
dt.Rows.Add(dr);
}
dt.AcceptChanges();
data1.ItemsSource = dt.DefaultView;
}