2010-03-09 61 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来改变“禁用”控制的出现,这给他们带来了一些残疾的感觉。