Почему DataGrid вызывает Linq-запрос при прокрутке? - PullRequest
3 голосов
/ 05 июня 2009

Я только начинаю работать с Linq, WPF и Silverlight. Я пытаюсь отобразить данные, которые происходят из XML-документа в DataGrid. Я использую запрос 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 Ответ

4 голосов
/ 05 июня 2009

Попробуйте: -

DataGrid.ItemsSource = query.ToList();

DataGrid не ожидает, что IEnumerable, к которому он обращается, вызывает что-то очень дорогое, когда он заставляет перечислитель находить элементы. Однако, передав сам запрос в DataGrid, вы заставляете запрос выполняться каждый раз, когда сетка данных вызывает GetEnumerator.

Поскольку вы хотите фильтровать позже, вы можете просто переназначить ItemsSource при изменении настроек фильтра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...