【问题标题】:Why does DataGrid call Linq query when scrolling?为什么 DataGrid 在滚动时会调用 Linq 查询?
【发布时间】:2010-10-31 14:52:54
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: linq silverlight performance datagrid


    【解决方案1】:

    试试:-

    DataGrid.ItemsSource = query.ToList();
    

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-24
      • 2022-06-27
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多