WPF DataGrid,处理键和无数据

Posted

技术标签:

【中文标题】WPF DataGrid,处理键和无数据【英文标题】:WPF DataGrid, handle keys and no data 【发布时间】:2012-03-21 02:54:12 【问题描述】:

我有一些 DataGrid,数据已绑定到我的集合 (INotifyCollectionChanged)。

创建新记录时必须预先填写记录。所以我禁用了添加 dataGrid (CanUserAddRows="False") 并处理“PreviewKeyUp”事件(当用户按下 ctrl+N 时,执行方法“CreateRecord” - 通知添加的新记录)。

这个场景完美……几乎。

PreviewKeyUp 仅在网格中的某些元素被聚焦时才被触发(例如 DataGridRow)。但是如果我没有任何记录,就没有焦点,并且事件永远不会被触发。

所以我的问题是:是否有可能在 DataGrid 为空时以某种方式处理键 ctrl+N?例如。触发 Focusable 或类似的东西。

另一种解决方法是“捕获”以某种方式添加行并填写必填字段,但是... 标准 NewItemPlaceholder 可以,但 EditableItems 使用不带参数的项目构造函数。 这是我无法使用的另一种想法(或者我只是不知道如何使用:D)

必须使用预定义的值(如 createdUserId)创建我的数据。

需要澄清的一些代码:

public MyItemsCollection Items  get; set; 

public MyItemType CreateRecord()

    MyItemType item = new MyItemType(userId);
    item.InitValues();
    Items.Add(item);
    return item;


/********/

public void dataGrid_PreviewKeyUp(object sender, KeyEventArgs e)

    if (e.Key == Key.N && e.KeyboardDevice.Modifiers == ModifierKeys.Control)
    
        CreateRecord();
        e.Handled = true;
    

<DataGrid AutoGenerateColumns="False" Name="dataGrid" ItemsSource="Binding Items"
          CanUserSortColumns="False" CanUserDeleteRows="True" 
          CanUserAddRows="False" PreviewKeyUp="dataGrid_PreviewKeyUp">

有人知道吗?

【问题讨论】:

【参考方案1】:

为什么不尝试附加到窗口的 PreviewKeyUp... 如果数据网格中没有记录,则强制它... 或者无论如何都强制它。只要该人处于该表单中,如果表单或网格具有此类按键的焦点,则可能暗示这样做。

【讨论】:

但是如果我在表单上有 2 个 DataGrid 怎么办......我如何识别哪个网格用户尝试添加新行? @Carnifex,那么您可以选择“询问”用户...将新记录添加到“网格 A”或“网格 B”并从中工作...或者,只是暗示其中一个grids 是将记录添加到的“默认”网格。 "default" 网格不是一个选项:两个网格 - 标题、行。用户可以(或必须)添加标题信息,然后添加详细信息行 用网格询问用户......也不可能 - 我想当我告诉他“你总是被问到你想要添加记录的网格”时客户的反应:D 我现在实施的选项是按钮“添加“靠近每个网格 - 但这会破坏设计。所以我想要一些正常的解决方案而不是解决方法 @Carnifex,我只是在回复您在表单级别捕获按键的初衷。使用双网格,那肯定是按钮控件,但是很多人有不同的 UI 愿景,没有一个解决方案绝对是最好的

以上是关于WPF DataGrid,处理键和无数据的主要内容,如果未能解决你的问题,请参考以下文章

WPF Datagrid行上下文菜单-禁用菜单项[关闭]

WPF DataGrid 绑定数据及时更新的处理

wpf datagrid cell 设置焦点

WPF DATAGrid 空白列 后台绑定列 处理

WPF datagrid 更新数据库

WPF DataGrid 表格样式怎么实现