当空白行获得焦点时,Datagrid添加新项目

时间:2019-06-05 11:18:27

标签: c# wpf xaml datagrid

我希望我的<DataGrid/>CanUserAddItems="true"在空白行获得默认行为的关注时,将新的ItemVM实例化,以创建新的{ {1}},当空白行第一次被编辑时。换句话说,我想将默认ItemVM的工作流程更改为:

  1. 用户输入空白行
  2. 用户按F2
  3. 新的DataGrid实例化

无需首先明确编辑空白行的自定义工作流程:

  1. 用户输入空白行
  2. 新的ItemVM实例化

在什么时候将新的ItemVM添加到绑定的ItemVM上并不重要。

1 个答案:

答案 0 :(得分:1)

DataGrid类使用私有的AddNewItem方法来实例化基础数据对象。

如果获得对占位符的行容器的引用,则可以处理其GotFocus事件并使用反射调用AddNewItem()方法:

private void DataGrid_Loaded(object sender, RoutedEventArgs e)
{
    DataGridRow newItemPlaceholderRow = (DataGridRow)dg.ItemContainerGenerator.ContainerFromItem(CollectionView.NewItemPlaceholder);
    if (newItemPlaceholderRow != null)
        newItemPlaceholderRow.GotFocus += (ss, ee) =>
        {
            typeof(DataGrid).GetMethod("AddNewItem",
                System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
                .Invoke(dg, null);
        };
}

请注意,AddNewItem()没有记录,可以在以后的版本中进行修改或删除,但是如果您确实想修改内置控件的行为,则另一个选择可能是创建自定义控件一个。