2009-06-05 2 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(); 

DataGridのは、アイテムを見つけるために列挙子を取得する場合に発生することは非常に高価なものを引き起こすためにアクセスしていることのIEnumerableを期待されていません。ただし、クエリ自体をDataGridに渡すと、データグリッドがGetEnumeratorを呼び出すたびにクエリが実行されます。

フィルタリングの設定を変更するときに後でフィルタリングする場合は、ItemsSourceを簡単に割り当てることができます。

+0

ブリリアント!それは動作します。ありがとう – paul

関連する問題