2011-09-07 6 views
8

여러 개의 열이있는 눈금이 있으며 사용자는 모든 열을 기준으로 정렬 할 수 있습니다. 그리드에 바인드 된 데이터는 사용자 정의 엔티티의 콜렉션입니다. 화면에 인쇄 버튼이 있으며이 버튼을 클릭하면 사용자 정의 인쇄가 필요합니다. 인쇄는 표에 표시된 것과 동일한 순서로 데이터를 표시해야합니다 (추가 데이터 포함)DataGrid에서 정렬 된 항목 소스를 얻는 방법

정렬 이벤트에서 데이터 소스를 정렬하는 대신 정렬 된 데이터 소스를 직접 가져올 수있는 방법이 있습니까?

감사 판 카지

답변

5

예, 있습니다. WPF에서는 항상 CollectionView이 바인딩되고 절대 컬렉션 자체는 바인딩되지 않습니다. 사용자가 직접 콜렉션보기를 지정하지 않으면, 기본값이 사용됩니다. 다음과 같이이 기본 콜렉션보기에 액세스 할 수 있습니다.

CollectionViewSource.GetDefaultView(yourCollectionOfCustomEntities); 

이것은 모든 정렬 및 필터링이 적용된 그리드에 표시된 콜렉션보기입니다.

+1

제가 이해하는 것은 (모든 열에서와 같이 사용자 정렬 데이터) 소스 컬렉션을 변경하지 않습니다 만 CollectionView 변경 얻을 것입니다. 내 인쇄물이 작동하려면 수집 양식 (List of Entities)의 데이터가 필요합니다. 따라서 기본 콜렉션 뷰로는 충분하지 않습니다. 콜렉션을 정렬 된 collectionView를 기반으로 정렬 할 수있는 쉬운 방법이 있습니까? 디버깅하는 동안 내가 관찰 한 한 가지는 CollectionView는 소팅 된 컬렉션을 가지고있는 protectedList InternalList를 가진다는 것입니다. 그러나 재산이 보호 받고 있기 때문에 나는 그것을 얻을 수 없습니다. –

+0

컬렉션보기에서 열거하면 항목이 정렬 된 순서로 반환되어야합니다 ... 확인하십시오 –

+0

예 컬렉션보기를 열거하고 정렬 된 컬렉션을 만들 수 있습니다. –

2

DataGrid의 Items 속성을 열거 할 수도 있습니다. ItemsSource 속성과 달리 Items 속성은 정렬 및 필터링을 포함하여 화면의 내용을 정확히 반영합니다. 예를 들면 다음과 같습니다.

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

yourDataGrid.Items를 사용해야합니다. 항목은 그리드의 현재보기를 반영합니다. 그리고 당신은 캐스트를 사용하여 변환해야하고 사용 후 .ToList();

상상이 당신의 답변에 따라

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

나는 이것이 받아 들인 것보다 더 나은 대답이라고 생각한다. –

관련 문제