WPF数据表格:当控件被禁用时,取消选中行

3
我有一个程序,用户可以在Datagrid中选择一行,然后点击“开始录制”按钮。当“录制”正在进行时,他们不被允许更改在datagrid中选择的值,所以我将IsEnabled设置为false。然而,当datagrid被设置为禁用时,它会取消选择已选中的行,这会破坏我对datagrid的SelectedItem属性的任何绑定。
是否有任何方法可以使datagrid行保持选中状态,即使控件被禁用?
编辑:这种情况在Windows Vista中不会发生,但在Windows 7中会发生。
3个回答

0

抱歉,我知道这篇文章有点旧了,但我在其他地方找不到解决方案。

它似乎与Vista\7无关,而是与Toolkit的2月份发布有关。

你可以像Jeff Wain建议的那样设置IsHitTestVisible = false,但正如Mike所指出的那样,它看起来并没有什么不同。此外,它不会禁用键盘输入。

我的解决方案是将DataGrid放在一个网格中,该网格与半透明灰色矩形位于同一行和列中(这将使它们彼此重叠)。您必须将矩形放在网格第二个位置,以确保它位于DataGrid之上。当我想要“禁用”它时,我会使矩形可见。这将使列表看起来变暗,并禁用鼠标输入,但它仍然不会禁用键盘输入。

要禁用键盘,我必须拦截“PreviewKeyDown”并设置e.Handdled = true。这将不允许选择任何其他内容,但当您切换到它时仍会发生一些有趣的事情(例如,Tab键不再起作用)。也许将其设置为不是选项卡停止和不可聚焦也可以解决此问题,但禁用选择是我真正关心的。


0
如果您真的想要“记录”操作,但仍然保持视觉和交互看起来相同,为什么不在选择时添加一个检查以确保不进行记录,并设置e.Handled = true呢?
或者,您可以将IsHitTestVisible = false设置为防止它们在控件中执行操作而不是完全禁用它。
希望这有所帮助。

在SelectionChanged事件中设置e.Handled似乎不起作用,因为该事件直到选择已更改(即太晚)才被调用。我在DataGrid中找不到任何“PreviewSelectionChanged”的等效项。另一方面,设置IsHitTestVisible而不是IsEnabled似乎可以正常工作,但视觉方面没有变化。我想这对我的目的来说没问题。谢谢! - Mike
啊,我没意识到你试图改变一些可视状态。当你禁用DataGrid时,你可能想要验证是否触发了其他事件。我刚刚在我们的一个实现中检查了一下是否取消选择了行,但是没有。 - Jeff Wain

0

IsHitTestVisible=false可以禁用鼠标输入。

要禁用键盘输入,请设置Focusable=false。

这两个属性都应该在ElementStyle和/或ElementEditingStyle中的内置数据网格列中设置,以便子控件(文本框、复选框等)不接受输入。

您很可能需要在样式中使用触发器,并将其绑定到某个IsRecording值。

此外,您还可以在同一样式中通过设置Opacity=0.4来改变“禁用”控件的外观,这会给人一种禁用的感觉。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接