我有DataTable,我正在尝试将DataGrid与DataTable绑定。但我的列不是简单的类型,它们是自定义对象。
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}" />
执行前不知道这些列。它们在运行时基于列表而已知,广告列表用于在数据表中添加列
当我将其绑定到datagrid时,对于列下的每一行,将显示完整的类名。我想将它绑定到类属性,并根据属性复选框(bool)或文本框(字符串)显示。
我正在关注MVVM模型。
答案 0 :(得分:0)
你必须使用下面提到的代码。
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"); }
}
然后你必须在collecton中输入值
MyData.Add(new NodeBool(true,1));
并且您的数据网格看起来像
<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>
答案 1 :(得分:0)
您可以做的是更改您的代码喜欢
<DataGrid Name="data1" AutoGenerateColumns="True" ItemsSource="{Binding Path=.}" />
在Code Behind中你可以做到的是
在其中创建一个DataTable并添加列,并在其中添加数据
DataTable dataTable=new DataTable();
// for循环使用反射获取对象的所有属性 dataTable.Columns.Add(item.Name);
// for循环用于获取dataTable中的所有信息
DataRow dr;
//像这样添加每个值
DR = dataTable.NewRow();
dr [propertyName] = object.Propertyname;
dataTable.Rows.Add(dr);
dataTable.AcceptChanges();
//然后将该表绑定到datagrid。
data1.ItemSource = dataTable.DefaultView
或
data1.DataContext = dataTable;
Exact Code Base将如下所示 在这里,我假设您的信息源将是类型列表(Node类),它将它转换为相应的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;
}