diff --git a/Source/Csla.test/BusinessListBase/AddNewAsyncTests.cs b/Source/Csla.test/BusinessListBase/AddNewAsyncTests.cs
new file mode 100644
index 0000000000..ed2e462583
--- /dev/null
+++ b/Source/Csla.test/BusinessListBase/AddNewAsyncTests.cs
@@ -0,0 +1,75 @@
+//-----------------------------------------------------------------------
+//
+// Copyright (c) Marimer LLC. All rights reserved.
+// Website: https://cslanet.com
+//
+// no summary
+//-----------------------------------------------------------------------
+
+using Csla.TestHelpers;
+using FluentAssertions;
+using FluentAssertions.Execution;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace Csla.Test.BusinessListBase
+{
+ [TestClass]
+ public class AddNewAsyncTests
+ {
+ private static TestDIContext _testDIContext;
+
+ [ClassInitialize]
+ public static void ClassInitialize(TestContext context)
+ {
+ _testDIContext = TestDIContextFactory.CreateDefaultContext();
+ }
+
+ [TestMethod]
+ public async Task RootAddNewCoreAsync()
+ {
+ bool changed = false;
+ var obj = CreateRootList();
+ obj.CollectionChanged += (_, _) =>
+ {
+ changed = true;
+ };
+ var child = await obj.AddNewAsync();
+ Assert.IsTrue(changed);
+ Assert.AreEqual(child, obj[0]);
+ }
+
+ [TestMethod]
+ public async Task ChildAddNewCoreAsync()
+ {
+ bool childChanged = false;
+ bool changed = false;
+ var obj = CreateRoot();
+ obj.ChildChanged += (_, _) =>
+ {
+ childChanged = true;
+ };
+ obj.Children.CollectionChanged += (_, _) =>
+ {
+ changed = true;
+ };
+ var child = await obj.Children.AddNewAsync();
+ Assert.IsTrue(childChanged, "ChildChanged should be true");
+ Assert.IsTrue(changed, "Collection changed should be true");
+ Assert.AreEqual(child, obj.Children[0]);
+ }
+
+ private Root CreateRoot()
+ {
+ IDataPortal dataPortal = _testDIContext.CreateDataPortal();
+
+ return dataPortal.Create();
+ }
+
+ private RootList CreateRootList()
+ {
+ IDataPortal dataPortal = _testDIContext.CreateDataPortal();
+
+ return dataPortal.Create();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/Csla/BusinessListBase.cs b/Source/Csla/BusinessListBase.cs
index a48b16960d..350e8d7138 100644
--- a/Source/Csla/BusinessListBase.cs
+++ b/Source/Csla/BusinessListBase.cs
@@ -308,6 +308,18 @@ protected override C AddNewCore()
return item;
}
+ ///
+ /// Override this method to create a new object that is added
+ /// to the collection.
+ ///
+ protected override async Task AddNewCoreAsync()
+ {
+ var dp = ApplicationContext.CreateInstanceDI>();
+ var item = await dp.CreateChildAsync();
+ Add(item);
+ return item;
+ }
+
///
/// This method is called by a child object when it
/// wants to be removed from the collection.
diff --git a/Source/Csla/Core/IObservableBindingList.cs b/Source/Csla/Core/IObservableBindingList.cs
index 1e2b5693e4..579289bc98 100644
--- a/Source/Csla/Core/IObservableBindingList.cs
+++ b/Source/Csla/Core/IObservableBindingList.cs
@@ -24,5 +24,9 @@ public interface IObservableBindingList
/// removed from the list.
///
event EventHandler RemovingItem;
+ ///
+ /// Creates and adds a new item to the collection.
+ ///
+ Task