2011-09-07 18 views
8

複数の列を持つグリッドがあり、ユーザーは任意の列に基づいてソートできます。グリッドにバインドされたデータは、カスタムエンティティの集合です。画面に印刷ボタンがあり、このボタンをクリックするとカスタム印刷が必要になります。グリッドに表示されているのと同じ順序でデータを表示する必要があります(追加データ付き)データグリッドからソートされたitemssourceを取得する方法

並べ替えイベントでデータソースを並べ替えるのではなく、並べ替えられたデータソースを直接取得する方法はありますか?

おかげ パンカジ

答えて

5

はい、あります。 WPFでは、常にCollectionViewがバインドされ、コレクション自体はバインドされません。自分でコレクションビューを指定しない場合は、デフォルトのコレクションビューが使用されます。あなたはこのように、このデフォルトのコレクションビューにアクセスすることができます。

CollectionViewSource.GetDefaultView(yourCollectionOfCustomEntities); 

これが適用されたすべてのソートやフィルタリングにグリッドによって示されるように、コレクション図です。

+1

を想像してみてください。私のプリントが機能するには、コレクション形式(List of Entities)のデータが必要です。したがって、デフォルトのコレクションビューでは不十分です。ソートされたcollectionViewに基づいてソートされたコレクションを取得する簡単な方法はありますか?デバッグ中に私が観察したことの1つは、CollectionViewにソートされたコレクションを持つInternalListという保護されたプロパティがあることです。しかし、このプロパティは保護されているので、私はそれを得ることはできません。 –

+0

コレクションビューで列挙すると、アイテムはソートされた順序で返されます。チェックしてください –

+0

はいコレクションビューを列挙し、並べ替えられたコレクションを構築できました。 –

2

DataGridのItemsプロパティを列挙することもできます。 ItemsSourceプロパティとは異なり、Itemsプロパティは並べ替えとフィルタリングを含む画面上のものを正確に反映するように見えます。例:

foreach (var item in dataGrid.Items) 
{ 
    // do something 
} 
7

グリッドの現在のビューを反映するyourDataGrid.Itemsを使用する必要があります。 です。キャスト後および使用後に.ToList()メソッドを使用して変換する必要があります。

は、私が理解していることはソースコレクションは決して変わらないとだけCollectionViewは、(任意の列で、ユーザーの種類のデータとして)変更を取得することで、あなたの回答に基づいて、この

List<MyClass> myListOfMyClass = new List<MyClass>(); 
myGrid.ItemSource = myListOfMyClass; 
List<MyClass> myListOfMyClassSortedByTheUser = myGrid.Items.Cast<MyClass>().ToList(); 
+3

これは受け入れられたものよりも良い答えだと思います。 –

関連する問題