From 474aa60403eda89401e078fe6e453c2940fad9a4 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 4 Aug 2017 20:03:33 +0200 Subject: [PATCH] Don't remove pseudoclasses when clearing Classes. Fixes #1080 --- src/Avalonia.Base/Collections/AvaloniaList.cs | 2 +- src/Avalonia.Controls/Classes.cs | 14 ++++++++++++++ tests/Avalonia.Controls.UnitTests/ClassesTests.cs | 12 ++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) 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); + } } }