【问题标题】:Datagrid add new item when the Blank Row gains focus当空白行获得焦点时,Datagrid 添加新项目
【发布时间】:2019-06-05 11:18:27
【问题描述】:

我希望我的<DataGrid/>CanUserAddItems="true" 在空白行获得焦点 而不是默认行为时设置新的ItemVM,以便在空白行创建新的ItemVM首先编辑。或者换句话说,我想将默认DataGrid的工作流程从:

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

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

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

将新的ItemVM 添加到绑定ItemsSource 的时间并不重要。

【问题讨论】:

    标签: c# wpf xaml datagrid


    【解决方案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() 未记录在案,可能会在未来的版本中被修改或删除,但如果您真的想修改内置控件的行为,另一种选择可能是创建您自己的自定义控件。

    【讨论】:

    • 您是否正在处理DataGridLoaded 事件?在装载之前没有集装箱。
    • 我的错误,将加载的处理程序添加到错误的 DataGrid 中(在测试项目中有多个数据网格来解决问题)。
    猜你喜欢
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多