1

我试图弄清楚如何将数据网格的 itemsource 绑定到列表。特别是,我使用 LINQ to SQL 从表中提取数据,并将其转换为列表:

        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 坐标。

4

2 回答 2

3

要让 DataGrid 从您的源集合接收更新,它需要实现INotifyCollectionChanged。幸运的是,ObservableCollection已经做到了。让您的数据库查询填充 ObservableCollection 并将您的 DataGrid 绑定到 ObservableCollection。

更新:

一个更好的答案是使用 MVVM 模式。您将创建一个与数据库接口的 Model 类和一个 ViewModel 类,用于准备数据以供呈现,但将其放入 ObservableCollection(例如)。然后,您的 View 将绑定到 ViewModel,您将在其中将 DataGrid 的 ItemsSource 设置为 ObservableCollection。请参阅这篇文章了解 MVVM 入门。

更新 #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}"/>
于 2012-04-18T18:03:57.117 回答
1

将 tempTable 放入 observable 集合中,将其分配给 datagrid 的 ItemsSource(当然是一次),然后在不断拉取新数据时,继续将其推入您的 observable 集合中,它将为您完成剩下的魔术。

于 2012-04-18T18:04:43.827 回答