2009-06-05 3 views
3

저는 Linq, WPF 및 Silverlight를 시작했습니다. DataGrid의 XML 문서에서 가져온 데이터를 표시하려고합니다. 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

시도

감사합니다 : -

DataGrid.ItemsSource = query.ToList(); 

데이터 격자는 항목을 찾을 수있는 열거를 얻을 때 발생하는 매우 비싼 무언가의 원인에 접근하고있는 IEnumerable을 기대하지 않습니다. 그러나 쿼리 자체를 DataGrid에 전달하면 데이터 그리드가 GetEnumerator를 호출 할 때마다 쿼리가 실행됩니다.

필터 설정을 변경하면 나중에 필터링 할 수 있으므로 ItemsSource를 간단하게 다시 지정할 수 있습니다.

+0

Brilliant! 그거야. 감사 – paul

관련 문제