2011-09-07 51 views
8

我有一個網格有多個列,用戶可以根據任何列進行排序。綁定網格的數據是自定義實體的集合。我在屏幕上有一個打印按鈕,點擊這個按鈕我需要做一個自定義打印。打印必須以與網格中顯示的順序顯示數據(附加數據)如何從數據網格獲取排序後的itemssource

有什麼方法可以直接獲取排序的數據源,而不是在排序事件中排序數據源嗎?

感謝 潘卡

回答

5

是的,有。在WPF中,始終綁定一個CollectionView,而不是集合本身。如果您自己未指定集合視圖,則使用默認集合視圖。您可以像這樣訪問此默認收集視圖:

CollectionViewSource.GetDefaultView(yourCollectionOfCustomEntities); 

這是收集視圖,如網格所示,應用了所有排序和過濾。

+1

根據您的回答我所瞭解的是,源集合永遠不會改變,僅會的CollectionView得到改變(在任何列,當用戶類型的數據)。爲了讓我的印刷品能夠工作,我需要收集表單中的數據(List(of Entities))。所以默認的集合視圖是不夠的。有沒有一種簡單的方法來獲得也基於排序的collectionView排序的集合?我在調試時觀察到的一件事是,CollectionView具有受保護的屬性InternalList,它具有已排序的集合。但由於財產受到保護,我無法得到它。 –

+0

當您枚舉集合視圖時,應按照排序順序返回項目...請檢查 –

+0

是的,我能枚舉collecion視圖並構建排序後的集合。 –

2

您也可以枚舉DataGrid的Items屬性。與ItemsSource屬性不同,Items屬性似乎完全反映了屏幕上的內容,包括排序和過濾。例如:

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

您必須使用yourDataGrid.Items,Items反映網格的當前視圖。 並且您必須使用Cast和使用後的.ToList();方法進行轉換。

想象這

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

我認爲這是比接受的更好的答案。 –