2011-03-08 60 views
3

有没有人试图实现以下场景?我希望了解有哪些解决方案可以实现这一目标。这已成为我们的用户真正的痛苦...WPF DataGrid - 在编辑行时禁用排序和筛选?

我们有一个WPF DataGrid,使用户能够根据列(其中Column = Value或开始,结束,包含等)筛选其数据行等等)。他们还可以通过单击其中一个Column标题对数据进行排序,或者我们还为它们提供了一个排序窗口,可以在其中添加多个列,并为每列选择升序/降序(仅适用于每个列的“SortDirection”属性他们选择,它似乎也与SortDescriptions一起使用“CollectionView”)。

问题是当用户正在编辑数据并应用“过滤器”或“排序”(或两者)时,如果用户在其中一个过滤/排序的列上编辑值,该行将“移动”并随同它一起移动光标。如果新值是“已过滤”的值,那么该行将完全消失(因为用户应用了“过滤”,因此它应该完全消失)。

他们希望无论是两件事情之一,而不是发生:

1 - 来吧,自动排序和过滤后的每个细胞被改变,如果行“动作”,将光标移动到下一行(相同的单元格),而不是该行跟随其新定义的光标(并且可能将当前可查看的数据行滚动到屏幕外)。

2 - 只要编辑一行,禁用所有的排序和过滤,直到用户单击“保存”或“刷新”(或其他选项)?

我也可以看到我们可能采取一种方法进行过滤,另一种方法进行排序。

有没有人有更好的主意或对如何实现这一点有任何想法?我有两个想法(例如,要禁用排序:在我的CellEditEnding事件处理程序中,我可以存储用户排序选项,从每列中清除它们,然后在用户单击保存/重置时重新应用它们或也许我可以处理“Sorting”事件,并在编辑数据时将“e.handled”设置为true ??)。我只是对WPF和DataGrid很陌生,我想知道是否可能有一个“最佳做法”,或者我没有找到的属性,如“DisableSorting = true/false”(lol)。

想法?意见?

+0

您是如何在编辑一行时设法更改过滤器的?由于编辑在控件丢失焦点时完成,并且CollectionView出现错误“AddNew或EditItem期间不允许使用”筛选“”。 – vorrtex 2011-03-08 20:39:29

+0

我想过绑定到DataGridRow类的IsEditing属性,但是Filter属性不允许测试您的场景。 – vorrtex 2011-03-08 20:41:38

+0

我没有。我只是说这是一个“主意”。 :)我没有看到一个简单的解决方案。也许重写实际排序的DataGrid方法?我似乎无法找到它。有一个“排序”方法,但点击列时只会触发它。实际的“排序”是什么方法? – Shayne 2011-03-08 22:12:15

回答

0

我决定试着从一个微软员工的角度,从另一个角度来解决这个问题。这是我所尝试过的...看起来像我唯一剩下的选择是创建我自己的DataGrid并重写适当的方法。

我决定添加一个“锁定”DataGrid的按钮。在这一点上,我会禁用所有排序,过滤,删除列等等等等。然后,我会复制DataTable,并将DataGrid.DataContext更改为我的新表,当他们完成编辑时,他们将“解锁”DataGrid,在这一点我会做一个DataTable.Merge()并重新绑定回主/源。他们所做的所有更改将位于“主”DataTable中,并且他们将能够编辑行和列,而不必在行上跳转(排序)或消失(过滤)。

然后我意识到了一些事情。首先,我需要使用DataTable.DefaultView并获取主/源DataTable的“过滤”视图,并将其分配给DataTableCopy(因此过滤的行不会显示在要编辑的DataTable中)。这不应该是一个问题,我不认为。然后,我意识到一些将是一个问题。一旦他们获得数据过滤并按照他们想要的方式排序,那么我将它复制并重新绑定到复制的表格(不包含隐藏或过滤的行),数据将不再被正确排序。对???我怎样才能让它被正确地排序,但是在编辑行和列时不使用DataGrid?

正如你所看到的,我基本上已经完成了原来的问题!如果我能以某种方式“禁用”筛选和排序,但保持数据的排序和过滤!

我没有太多的经验与此,但我不能(在理论上)使用反汇编(反射?虽然它仍然是free..lol ...)并建立我自己的DataGrid类?我只需要重写用于过滤/排序的任何方法。对?我浏览了一下DataGrid类,但是甚至找不到要“覆盖”的方法。我认为有一种方法可以设置Reflector,以便您可以进入(调试)反汇编代码。看起来这可能是我唯一的选择。

其他建议?

更新:我的假设错了!它看起来像我使用DataTable.DefaultView.ToTable(),它不仅“保留”过滤,但它保留了“排序顺序”。这个解决方案看起来像是要继续工作!

3

我刚刚有同样的问题,似乎找到了解决办法。很简单 - 只需添加另一个SortDescription作为辅助排序标准即可。