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

为什么在滚动时DataGrid调用Linq查询?,linq,silverlight,performance,datagrid,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 Perso

我刚刚开始学习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?对象。)

为什么会这样?我假设“查询”只执行一次,而不是连续执行

这样做的正确方式是什么?我之所以使用查询,是因为我想添加某种过滤器,以便在以后限制列表中的项目

谢谢

试试:-

DataGrid.ItemsSource = query.ToList();
DataGrid不希望它正在访问的IEnumerable在让枚举器查找项时导致非常昂贵的事情发生。但是,通过将查询本身传递给DataGrid,您可以在DataGrid每次调用GetEnumerator时执行查询

由于您希望在以后进行筛选,因此在更改筛选设置时只需重新分配ItemsSource即可