我一直在谷歌上搜索并在这里寻找答案,但我仍然无法理解一个非常基本的事情 - 如何将
DataTable
转换为 ObservableCollection
?
这就是我已经走了多远:
public ObservableCollection<Test> test;
public class Test
{
public int id_test { get; set; }
public string name { get; set; }
}
主要..
DataTable TestTable = new DataTable();
TestTable.Columns.Add(new DataColumn("id_test", typeof(int)));
TestTable.Columns.Add(new DataColumn("name", typeof(string)));
DS.Tables.Add(TestTable);
var test = new ObservableCollection<Test>();
foreach (DataRow row in test_table.Rows)
{
var obj = new Test()
{
id_test = (int)row.ItemArray[0],
name = (string)row.ItemArray[1]
};
test.Add(obj);
}
我更新了代码,它似乎可以工作。
您不想为表中的每一行创建一个新集合,而是为整个表创建一个集合(集合中的一个对象是为表中的一行创建的):
var test = new ObservableCollection<Test>();
foreach(var row in TestTable.Rows)
{
var obj = new Test()
{
id_test = (int)row["id_test"],
name = (string)row["name"]
};
test.Add(obj);
}
我对已接受的解决方案有一点疑问。 它不允许在 var 类型上使用 [] 括号。
var test = new ObservableCollection<Test>();
foreach(DataRow row in TestTable.Rows)
{
test.Add(new Test()
{
id_test = (int)row["id_test"],
name = (string)row["name"],
});
}
如果您打算使用此 ObservableCollection 绑定到 WPF 控件并获取更改通知,则可能不需要进行 DataTable > ObservableCollection 转换。一些内置 WPF 控件(例如
System.Windows.Controls.DataGrid
)在绑定到 DataTable 时已经提供了更改通知机制。例如,当您添加、更新或删除源 DataTable 中的行时,DataGrid 将自动反映这些更改。示例:
<DataGrid ItemsSource="{Binding ViewModelPropertyAsDataTable}"/>
另一方面,一些第三方控件(例如 Telerik RadGridView)使用 DataTable.DefaultView 属性 来提供更改通知。示例:
<telerik:RadGridView ItemsSource="{Binding ViewModelPropertyAsDataTable.DefaultView}"/>