2009-06-05 5 views
3

Я только начинаю с Linq, WPF и Silverlight. Я пытаюсь отобразить данные, которые происходят из XML-документа в DataGrid. Я использую запрос Linq, чтобы выбрать объекты, которые я хочу, и связать результат с DataGrid.Почему DataGrid вызывает запрос Linq при прокрутке?

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?).

Почему это? Я предположил, что «запрос» будет выполняться один раз, а не постоянно.

Что было бы правильным путем? Я использую запрос, потому что я хочу добавить какой-то фильтр, чтобы ограничить элементы в списке позже.

Благодаря

ответ

4

Try: -

DataGrid.ItemsSource = query.ToList(); 

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

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

+0

Блестящий! Это работает. благодаря – paul

 Смежные вопросы

  • Нет связанных вопросов^_^