2009-06-05 30 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

太棒了!這樣可行。謝謝 – paul 2009-06-05 11:39:52