禁用控件时,WPF Datagrid取消选择行

时间:2010-03-09 19:36:19

标签: wpf data-binding datagrid wpfdatagrid

我有一个程序,用户在其中选择Datagrid中的行,然后单击“开始录制”按钮。在发生“录制”时,不允许它们更改数据网格中选择的值,因此我将IsEnabled设置为false。但是,当数据网格设置为禁用时,它会取消选择所选行,这会将我对数据网格的SelectedItem属性的任何绑定搞砸。

即使控件被禁用,有没有办法保持数据网格行被选中?

编辑:这在Windows Vista中不会发生,但在Windows 7中会发生。

3 个答案:

答案 0 :(得分:0)

如果你真的想要'记录'动作,但仍然保持视觉和交互看起来一样,为什么你不只是对选择时触发的事件添加一个检查,以确保没有进行记录并设置e.Handled = true。

或者你可以设置IsHitTestVisible = false并阻止它们在控件中执行操作,而不是直接禁用它。

希望有所帮助。

答案 1 :(得分:0)

对不起,我知道这篇文章有点老了,但我找不到其他地方的另一个解决方案。

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

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

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

要禁用键盘,我必须拦截'PreviewKeyDown'并设置e.Handdled = true。这将不允许选择其他任何东西,但是当你选择它时仍会做一些有趣的事情(比如tab不再工作)。也许将它设置为不是制表位并且不可聚焦也会解决这个问题,但禁用选择是我真正关心的。

答案 2 :(得分:0)

IsHitTestVisible = false禁用鼠标输入。

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

两者都应该通过ElementStyle和/或ElementEditingStyle中的样式设置内置的datagrid列,以便子控件(文本框,复选框等)不接受输入。

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

你也可以用同样的方式通过设置它们的Opacity = 0.4来改变“禁用”控件的外观,这给它们带来了一些残疾的感觉。