diff --git a/TrackerDog.Signed/Properties/AssemblyInfo.cs b/TrackerDog.Signed/Properties/AssemblyInfo.cs
index 91fd590..461f858 100644
--- a/TrackerDog.Signed/Properties/AssemblyInfo.cs
+++ b/TrackerDog.Signed/Properties/AssemblyInfo.cs
@@ -33,8 +33,8 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("2.1.4.0")]
-[assembly: AssemblyFileVersion("2.1.4.0")]
+[assembly: AssemblyVersion("2.1.5.0")]
+[assembly: AssemblyFileVersion("2.1.5.0")]
[assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]
[assembly: InternalsVisibleTo("TrackerDog.Test.Signed, PublicKey=00240000048000009400000006020000002400005253413100040000010001001ffcf2febdbe56c43afff66e091d7220aa0e53b1638c84e8ae732b444410137f0cc754459f5691f74313921820a490e8761982edac1f051ba141be96bb9f82b4ea4a80b6b87e8c99831fdb69473821dbda3622a8cd3c439ddf3b76cba5ff89809423b7e02ea2b55a12f2b2f5ce0ce377bb2bb4831ce02f7a71cce368e346ecba")]
\ No newline at end of file
diff --git a/TrackerDog.Signed/TrackerDog.Signed.csproj b/TrackerDog.Signed/TrackerDog.Signed.csproj
index 77c80c6..0b0f866 100644
--- a/TrackerDog.Signed/TrackerDog.Signed.csproj
+++ b/TrackerDog.Signed/TrackerDog.Signed.csproj
@@ -71,6 +71,9 @@
CollectionChangeTrackingContext.cs
+
+ CollectionExtensions.cs
+
CollectionHandling\CollectionChange.cs
@@ -161,6 +164,9 @@
Hooks\SimplePropertyInterceptionHook.cs
+
+ ICanClearChanges.cs
+
IChangeTrackableCollection.cs
diff --git a/TrackerDog.Test/CollectionTest.cs b/TrackerDog.Test/CollectionTest.cs
index 8dc21a1..1679156 100644
--- a/TrackerDog.Test/CollectionTest.cs
+++ b/TrackerDog.Test/CollectionTest.cs
@@ -264,5 +264,21 @@ public void ArrayMustNotBeTrackedAsCollections()
Assert.IsTrue(g.PropertyHasChanged(o => o.Buffer));
Assert.IsNotInstanceOfType(g.Buffer, typeof(IReadOnlyChangeTrackableCollection));
}
+
+ [TestMethod]
+ public void CanClearCollectionChanges()
+ {
+ A a = TrackableObjectFactory.CreateOf();
+ a.Items.Add("a");
+ a.Items.Add("b");
+
+ a.Items.ClearChanges();
+
+ IReadOnlyChangeTrackableCollection trackableCollection
+ = (IReadOnlyChangeTrackableCollection)a.Items;
+
+ Assert.AreEqual(0, trackableCollection.AddedItems.Count);
+ Assert.AreEqual(0, trackableCollection.RemovedItems.Count);
+ }
}
}
\ No newline at end of file
diff --git a/TrackerDog/CollectionExtensions.cs b/TrackerDog/CollectionExtensions.cs
new file mode 100644
index 0000000..2e4404f
--- /dev/null
+++ b/TrackerDog/CollectionExtensions.cs
@@ -0,0 +1,17 @@
+using System.Collections.Generic;
+using System.Diagnostics.Contracts;
+
+namespace TrackerDog
+{
+ public static class CollectionExtensions
+ {
+ public static void ClearChanges(this ICollection source)
+ {
+ Contract.Requires(source is ICanClearChanges, $"Given collection must implement 'TrackerDog.ICanClearChanges'");
+
+ ICanClearChanges canClearChanges = (ICanClearChanges)source;
+
+ canClearChanges.ClearChanges();
+ }
+ }
+}
diff --git a/TrackerDog/ICanClearChanges.cs b/TrackerDog/ICanClearChanges.cs
new file mode 100644
index 0000000..86245f8
--- /dev/null
+++ b/TrackerDog/ICanClearChanges.cs
@@ -0,0 +1,7 @@
+namespace TrackerDog
+{
+ public interface ICanClearChanges
+ {
+ void ClearChanges();
+ }
+}
\ No newline at end of file
diff --git a/TrackerDog/IChangeTrackableCollectionContract.cs b/TrackerDog/IChangeTrackableCollectionContract.cs
index 0977a34..595a68d 100644
--- a/TrackerDog/IChangeTrackableCollectionContract.cs
+++ b/TrackerDog/IChangeTrackableCollectionContract.cs
@@ -19,7 +19,7 @@ internal abstract class IChangeTrackableCollectionContract : IChangeTrackableCol
public HashSet