2010-05-05 73 views
1

我有一個場景,我想在Silverlight 3中的DataGrid中顯示分層數據,同時使標題行仍具有標準的單元格集並且可以編輯。用戶需要能夠摺疊和展開行以隱藏子行。Silverlight DataGrid導航和隱藏行

我已經完成了這項工作,每個父行上都有一個按鈕,它看起來像崩潰或擴展字形,取決於它的狀態。點擊它可以處理其子行的數據項屬性。每行的可見性都綁定到數據項的這個屬性。

這個工作有點體面,雖然它的網格渲染更多的列比它需要的性能問題。

我現在的問題是,當用戶在鍵盤上打開或關閉時,他們能夠導航到隱藏的行。

例如,如果我有像

1父的結構(膨脹,可見光)

1A(可見)

1B(可見)

2 Parent(主摺疊,可見)

2A(隱藏)

3父(膨化,可見光)

3a中(可見)

如果我已經[2父]中選擇和予按下向下箭頭上儘管[2a]的行可見性設置爲Visibility.Collapsed,但我希望該選擇可以轉到[3 Parent],但它會轉到[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歸零,因爲如果我不這樣做,那麼DataGrid將不會更新其已過濾的行集。

這也解決了我的性能問題,包括摺疊/展開,因爲DataGrid處理過濾的行要好得多,因爲它不必爲了將其可見性設置爲Collapsed而實例化行。

希望這可以幫助那些有類似困難的人。