internal void OnCommittingNewItem(DataGridCommittingNewItemEventArgs e)
 {
     if (this.CommittingNewItem != null)
     {
         this.CommittingNewItem(this, e);
     }
 }
        public override void CommitNew()
        {
            // We are not calling base since the intended behavior is quite different with Virtualizing collection views.
            object currentAddItem = this.CurrentAddItem;

            if (currentAddItem == null)
            {
                return;
            }

            DataGridCommittingNewItemEventArgs committingNewItemEventArgs =
                new DataGridCommittingNewItemEventArgs(this, currentAddItem, false);

            this.RootDataGridCollectionViewBase.OnCommittingNewItem(committingNewItemEventArgs);

            if (committingNewItemEventArgs.Cancel)
            {
                throw new DataGridException("CommitNew was canceled.");
            }

            if (!committingNewItemEventArgs.Handled)
            {
                throw new InvalidOperationException("When manually handling the item-insertion process the CreatingNewItem, CommittingNewItem, and CancelingNewItem events must all be handled.");
            }

            // Contrarily to the data bound collection views, we do not care about the new index or new count since we will enqueue a Refresh operation.

            this.SetCurrentAddNew(null, -1);

            this.ExecuteOrQueueSourceItemOperation(new DeferredOperation(DeferredOperation.DeferredOperationAction.Refresh, -1, null));
        }