【问题标题】:Silverlight DataGrid Navigation and Hidden RowsSilverlight DataGrid 导航和隐藏行
【发布时间】:2011-02-15 23:25:08
【问题描述】:

我有一个场景,我想在 Silverlight 3 的 DataGrid 中显示分层数据,同时标题行仍然具有标准的单元格集并且是可编辑的。用户需要能够折叠和展开行以隐藏子行。

我通过在每个父行上都有一个按钮来实现这一点,该按钮看起来像折叠或展开字形,具体取决于其状态。单击此按钮可操作其子行的数据项上的属性。每行的可见性都绑定到数据项的此属性。

虽然它确实存在性能问题,但网格渲染的列比它需要的多。

我现在的问题是,当用户向上或向下敲击键盘时,他们能够导航到隐藏的行。

例如,如果我有这样的结构

1 个父级(展开,可见)

1a(可见)

1b(可见)

2 父级(折叠,可见)

2a(隐藏)

3 父级(展开,可见)

3a(可见)

如果我选择了 [2 Parent] 并且我点击了键盘上的向下箭头,我希望选择转到 [3 Parent] 但它会转到 [2a],即使 [2a] 的行可见性是设置为 Visibility.Collapsed。

我希望能够拦截键盘事件(通过诸如不存在的 PreviewKeyDown 事件之类的事件)并自己处理它,或者找到某种方法来欺骗 DataGrid 的内部以移动到正确的项目。

在这一点上,我相当投入地调整行可见性以隐藏这些项目。

有什么想法吗?

【问题讨论】:

    标签: silverlight datagrid navigation


    【解决方案1】:

    好的,我发布后正在考虑这个问题。我曾尝试使用 PagedCollectionView 进行分组,但对分组样式不满意,但我没有尝试使用它进行过滤。

    我现在将 DataGrid 的旧 ItemsSource 包装在 PagedCollectionView 中,然后将其 Filter 设置为基于数据项的可见性属性返回的方法。

      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 而实例化一行。

    希望这可以帮助其他有类似困难的人。

    【讨论】:

      猜你喜欢
      • 2011-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多