我刚开始使用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?对象。)
这是为什么?我曾假设'查询'将被执行一次而不是连续执行。
这样做的正确方法是什么?我正在使用查询,因为我想添加某种过滤器来限制列表中的项目。
由于
答案 0 :(得分:4)
尝试: -
DataGrid.ItemsSource = query.ToList();
DataGrid不期望它正在访问的IEnumerable导致在获取枚举器来查找项目时会发生非常昂贵的事情。但是,通过将查询本身传递给DataGrid,每次数据网格调用GetEnumerator时都会执行查询。
由于您希望稍后过滤,因此您可以在更改过滤器设置时重新分配ItemsSource。