2010-03-09 59 views
3

我有一個程序,用戶在Datagrid中選擇一行,然後單擊「開始錄製」按鈕。在「記錄」發生時,不允許更改數據網格中選定的值,因此我將IsEnabled設置爲false。但是,當datagrid被設置爲禁用時,它將取消選擇所選行,這會將我對數據網格的SelectedItem propery的任何綁定關閉。WPF Datagrid取消選擇控制禁用時的行

即使控件被禁用,是否有任何方法可以保持datagrid行被選中?

編輯:這不會在Windows Vista中發生,但它在Windows 7中

回答

0

有,如果你真的想「記錄」的行動,但仍然保持視覺效果和交互長得一模一樣,你爲什麼不只是將選中的事件添加到選中的事件中,以確保記錄不會發生,並設置e.Handled = true。

或者,您可以設置IsHitTestVisible = false並阻止他們在控件中執行操作,而不是直接禁用它。

希望有所幫助。

+0

在SelectionChanged事件中設置e.Handled不起作用,因爲看起來事件不會被調用,直到選擇已經被改變(即,在太遲之後)。我無法在DataGrid中找到任何類似的「PreviewSelectionChanged」。 另一方面,設置IsHitTestVisible而不是IsEnabled似乎工作正常,除了視覺方面沒有改變。我想這對我的目的是沒問題的。 謝謝! – Mike 2010-03-10 15:05:17

+0

啊,沒有意識到你試圖改變一些視覺狀態。您可能想要驗證在禁用DataGrid時某些其他事件未觸發。我只是在我們的一個實現中進行了檢查,看看是否取消選擇了這些行,而沒有這樣做。 – 2010-03-10 22:26:37

0

對不起,我知道這篇文章有點舊了,但我找不到別的解決辦法。

它似乎並沒有涉及到Vista \ 7,而是涉及工具包的2月版本。

按照Jeff Wain的建議,您可以設置IsHitTestVisible = false,但正如Mike指出的那樣,它看起來並不一樣。另外,它不禁用鍵盤輸入。

我的解決方案是將DataGrid放置在與半透明灰色矩形相同的行和列內(這會使它們位於另一個之上)。您必須將矩形放在網格中,以確保它位於DataGrid的頂部。當我想'禁用'它時,我使矩形可見。這將使列表變灰,並禁用鼠標輸入,但仍不會禁用鍵盤輸入。

要禁用鍵盤,我必須截取'PreviewKeyDown'並設置e.Handdled = true。這不會允許選擇其他任何東西,但當您選中它時仍然會執行一些有趣的事情(如選項卡不再有效)。也許將它設置爲不是製表位並且不可聚焦也會解決這個問題,但禁用選擇是我真正關心的。

0

IsHitTestVisible = false禁用鼠標輸入。

禁用鍵盤輸入設置Focusable = false。

兩者都應通過ElementStyle和/或ElementEditingStyle中的內置數據格列設置,以便子控件(文本框,複選框等)不接受輸入。

您很可能必須在樣式中使用觸發器並將其綁定到某個IsRecording值。

同樣,你可以通過設置其不透明度= 0.4來改變「禁用」控制的出現,這給他們帶來了一些殘疾的感覺。