2010-05-05 4 views
1

Silverlight 3의 DataGrid에 계층 적 데이터를 표시하고 헤더 행에 여전히 표준 셀 집합이 있고 편집 가능한 시나리오가 있습니다. 사용자는 행을 축소하고 확장하여 하위 행을 숨길 수 있어야합니다.Silverlight DataGrid 탐색 및 숨겨진 행

각 부모 행에 상태에 따라 붕괴 또는 확장 글리프 모양의 버튼을 표시하여이 작업을 수행했습니다. 이것을 클릭하면 자식 행에 대한 데이터 항목의 속성을 조작합니다. 각 행의 가시성은 데이터 항목의이 속성에 바인딩됩니다.

그리드가 성능 향상에 문제가 있지만 필요한 것보다 많은 열을 렌더링하는 경우에는 다소 효과가 있습니다.

이제 내 문제는 사용자가 키보드에서 위아래로 움직이면 숨겨진 행을 탐색 할 수 있다는 것입니다.

I는 (가시 확대)

1 부모와 같은 구조 (표시)

1B (표시)

2 상위

1A있는 경우 (축소됨, 표시됨)

2A (표시 확대) (알)

3 부모 (표시)

3A는

I [2 부모]를 선택하고 I는 다운 화살표를 치면 키보드를 선택하면 [3 Parent]로 이동하지만 [2a]의 행 가시성이 Visibility.Collapsed로 설정되어 있어도 [2a]로 이동합니다.

(존재하지 않는 PreviewKeyDown 이벤트와 같은 것을 통해) 키보드 이벤트를 가로 채고 직접 처리하거나 DataGrid의 내부 항목을 올바른 항목으로 이동시키는 방법을 찾으려합니다.

이 시점에서 나는이 항목을 숨겨서 행 가시성을 조정하는 데 상당히 투자하고 있습니다.

아이디어가 있으십니까?

답변

1

좋아요, 제가 게시 한 후에 이것에 대해 생각하고있었습니다. 그룹화를 위해 PagedCollectionView를 사용해 보았지만 그룹 스타일에 만족하지 못했지만 필터링을 위해 사용하지 않았습니다.

DataGrid의 이전 ItemsSource를 PagedCollectionView 내부에 래핑 한 다음 필터를 내 데이터 항목의 가시성 속성을 기반으로 반환하는 메서드로 설정합니다.

Private Sub UpdateFilter(ByVal view As PagedCollectionView) 
    If view IsNot Nothing Then 
     view.Filter = Nothing 
     view.Filter = New Predicate(Of Object)(AddressOf FilterRows) 
    End If 
    End Sub 

    Private Function FilterRows(ByVal obj As Object) As Boolean 
    Dim item As MyDataItem = obj 
    Return item.IsVisible = Windows.Visibility.Visible 
    End Function 

이 방법의 유일한 문제는 필터링 바인딩을 사용하지 이후로는 MyDataItem의 속성 변경 이벤트를 보는 경우 필터를 새로 고칠 것입니다.IsVisible

이 문제를 해결하기 위해 행 항목의 이벤트에 응답하고 항목이 확장되거나 축소 될 때마다 UpdateFilter를 호출합니다. View.Filter가 null 인 경우 DataGrid가 필터 된 행 집합을 업데이트하지 않기 때문에 필터를 사용하고 있습니다.

또한 데이터 그리드가 필터링 된 행을 훨씬 더 잘 처리하기 때문에 축소/확장과 관련된 내 성능 문제는 해결됩니다. 가시성을 축소로 설정하기 위해 행을 인스턴스화 할 필요가 없기 때문입니다.

희망이 있으면 다른 사람들도 비슷한 어려움을 겪을 수 있습니다.