WPF +将DataGrid ItemSsource绑定到List

时间:2012-04-18 17:52:00

标签: c# wpf

我正在试图弄清楚如何将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坐标。

2 个答案:

答案 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(当然是一次),然后在继续提取新数据时,继续将其推送到您的可观察集合中,它将为您完成其余的魔法。