【问题标题】:WPF Datagrid deselects row when control is disabled禁用控件时WPF Datagrid取消选择行
【发布时间】:2010-03-09 19:36:19
【问题描述】:

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

即使控件被禁用,是否有任何方法可以保持选中数据网格行?

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

【问题讨论】:

    标签: wpf data-binding datagrid wpfdatagrid


    【解决方案1】:

    如果您确实想“记录”动作,但仍保持视觉效果和交互看起来相同,为什么不直接对在选择时触发的事件添加检查以确保不进行记录并设置 e.Handled = 真。

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

    希望对您有所帮助。

    【讨论】:

    • 在 SelectionChanged 事件中设置 e.Handled 不起作用,因为似乎直到选择已经更改(即,为时已晚)才调用事件。我在 DataGrid 中找不到任何与“PreviewSelectionChanged”等效的东西。另一方面,设置 IsHitTestVisible 而不是 IsEnabled 似乎可以正常工作,只是视觉方面没有改变。我想这对我的目的来说是可以的。谢谢!
    • 啊,没有意识到你正在尝试改变一些视觉状态。您可能想要验证在禁用 DataGrid 时是否未触发某些附加事件。我刚刚在我们的一个实现中检查了是否取消选择了行,但它没有。
    【解决方案2】:

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

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

    您可以按照 Jeff Wain 的建议设置 IsHitTestVisible = false,但正如 Mike 所说,它看起来并没有什么不同。此外,它不会禁用键盘输入。

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

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

    【讨论】:

      【解决方案3】:

      IsHitTestVisible=false 禁用鼠标输入。

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

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

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

      您也可以以相同的风格通过设置 Opacity=0.4 来更改“禁用”控件的外观,这会给它们带来某种禁用的感觉。

      【讨论】:

        猜你喜欢
        • 2015-07-17
        • 2020-12-14
        • 1970-01-01
        • 1970-01-01
        • 2013-04-19
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        • 2011-01-30
        相关资源
        最近更新 更多