gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:35:30 25 4
gpt4 key购买 nike

我刚刚开始使用 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,您会导致查询在每次数据网格调用 GetEnumerator 时执行。

由于您想在以后进行过滤,您可以在更改过滤器设置时简单地重新分配 ItemsSource。

关于linq - 为什么 DataGrid 在滚动时会调用 Linq 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/955366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com