我正在试图弄清楚如何将datagrid的itemsource绑定到List。特别是,我使用LINQ to SQL从表中提取数据,并将其转换为List:
var tempTable = (from p in dc.LiveData
select new Custom_GridResult
{ x = p.x,
y = p.y,
z = p.z
}).ToList();
dataGrid.ItemsSource = tempTable.ToList();
public class CustomETO_GridResult
{
public CustomETO_GridResult()
{ }
double x { get; set; }
public double y{ get; set; }
public double z{ get; set; }
}
我的计划是每隔几分钟重新提取数据(因为它不断更新),我希望我的DataGrid自动反映更改。我是否更容易不断重新设置ItemsSource,还是有另一种方式?
非常感谢
编辑:我应该补充一点,数据库有一个恒定的行数(它们是预定义的)。不断更新的是数据库中的值。例如,假装它是一个飞机数据库,并且不断更新列值,以及飞机飞行位置的GPS坐标。
答案 0 :(得分:3)
要使DataGrid从源集合接收更新,需要实现INotifyCollectionChanged。幸运的是,ObservableCollection已经做到了。让您的数据库查询填充ObservableCollection并将DataGrid绑定到ObservableCollection。
<强>更新强>
更好的答案是使用MVVM模式。您将创建一个与数据库接口的Model类和一个ViewModel类,该类为表示准备数据,但将其放入ObservableCollection(例如)。然后,您的View将绑定到ViewModel,您可以在其中将DataGrid的ItemsSource设置为ObservableCollection。有关MVVM入门的信息,请参阅this post。
更新#2: 在控件的构造函数中创建ViewModel的实例,并将其分配给控件的DataContext。您的DataGrid将绑定到ViewModel上的Results属性。当ObservableCollection的内容改变时,DataGrid的内容将自动更新。 Ñ
代码:
public class ViewModel
{
public ObservableCollection<CustomETO_GridResult> Results {get;set;}
// Call this method to update the ObservableCollection, obviously could use some optimization
public void UpdateFromDatabase()
{
var query = // make your database query
Results.Clear();
foreach(CustomETO_GridResult result in query)
Results.add(result);
}
... // Initialize ObservableCollection, do other work, etc.
}
XAML:
<DataGrid ItemsSource="{Binding Results}"/>
答案 1 :(得分:1)
将tempTable放入可观察的集合中,将其分配给datagrid的ItemsSource(当然是一次),然后在继续提取新数据时,继续将其推送到您的可观察集合中,它将为您完成其余的魔法。