2011-03-08 458 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作爲輔助排序標準即可。