diff --git a/src/Avalonia.Base/Collections/AvaloniaList.cs b/src/Avalonia.Base/Collections/AvaloniaList.cs index ace898b55f..a3c3015a38 100644 --- a/src/Avalonia.Base/Collections/AvaloniaList.cs +++ b/src/Avalonia.Base/Collections/AvaloniaList.cs @@ -220,7 +220,7 @@ namespace Avalonia.Collections /// /// Removes all items from the collection. /// - public void Clear() + public virtual void Clear() { if (this.Count > 0) { diff --git a/src/Avalonia.Controls/Classes.cs b/src/Avalonia.Controls/Classes.cs index 02fd6e63bf..c897e86697 100644 --- a/src/Avalonia.Controls/Classes.cs +++ b/src/Avalonia.Controls/Classes.cs @@ -86,6 +86,20 @@ namespace Avalonia.Controls base.AddRange(c); } + /// + /// Remvoes all non-pseudoclasses from the collection. + /// + public override void Clear() + { + for (var i = Count - 1; i >= 0; --i) + { + if (!this[i].StartsWith(":")) + { + RemoveAt(i); + } + } + } + /// /// Inserts a style class into the collection. /// diff --git a/tests/Avalonia.Controls.UnitTests/ClassesTests.cs b/tests/Avalonia.Controls.UnitTests/ClassesTests.cs index fae97bada7..c9b9d9f82c 100644 --- a/tests/Avalonia.Controls.UnitTests/ClassesTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ClassesTests.cs @@ -149,5 +149,17 @@ namespace Avalonia.Controls.UnitTests Assert.Throws(() => target.Replace(new[] { ":qux" })); } + + [Fact] + public void Clear_Should_Not_Remove_Pseudoclasses() + { + var target = new Classes("foo", "bar"); + + ((IPseudoClasses)target).Add(":baz"); + + target.Clear(); + + Assert.Equal(new[] { ":baz" }, target); + } } }