为什么DataGrid在滚动时调用Linq查询?

时间:2009-06-05 11:14:55

标签: linq silverlight performance datagrid

我刚开始使用Linq,WPF和Silverlight。我试图显示源自DataGrid中的XML文档的数据。我使用Linq查询来选择我想要的对象并将结果链接到DataGrid。

XDocument doc = GedView.GedcomConverter.ConvertToXml(new StreamReader(e.Result));
var query = from person in doc.Descendants("INDI")
            select new PersonInfo()
            {
              Id = (string)person.Attribute("Value"),
              GedcomName = (string)person.Descendants("NAME").SingleOrDefault().Attribute("Value"),
              Sex = (string)person.Descendants("SEX").SingleOrDefault().Attribute("Value"),
              BirthDate = GedcomConverter.ConvertDate(person.Descendants("BIRT").SingleOrDefault()),
              DeathDate = GedcomConverter.ConvertDate(person.Descendants("DEAT").SingleOrDefault()),
              BurialDate = GedcomConverter.ConvertDate(person.Descendants("BURI").SingleOrDefault()),
            };
DataGrid.ItemsSource = query;
DataGrid.SelectedIndex = -1;

但是,当滚动网格时,性能很差。我注意到ConvertDate方法被多次调用。 (ConvertDate方法将人类可读的日期字符串转换为DateTime?对象。)

这是为什么?我曾假设'查询'将被执行一次而不是连续执行。

这样做的正确方法是什么?我正在使用查询,因为我想添加某种过滤器来限制列表中的项目。

由于

1 个答案:

答案 0 :(得分:4)

尝试: -

DataGrid.ItemsSource = query.ToList();

DataGrid不期望它正在访问的IEnumerable导致在获取枚举器来查找项目时会发生非常昂贵的事情。但是,通过将查询本身传递给DataGrid,每次数据网格调用GetEnumerator时都会执行查询。

由于您希望稍后过滤,因此您可以在更改过滤器设置时重新分配ItemsSource。