diff --git a/src/Compatibility/Core/src/Android/CollectionView/PropertyChangedEventArgsExtensions.cs b/src/Compatibility/Core/src/Android/CollectionView/PropertyChangedEventArgsExtensions.cs deleted file mode 100644 index 8656d4e39edc..000000000000 --- a/src/Compatibility/Core/src/Android/CollectionView/PropertyChangedEventArgsExtensions.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.ComponentModel; -using System.Runtime.CompilerServices; - -namespace Microsoft.Maui.Controls.Compatibility.Platform.Android -{ - internal static class PropertyChangedEventArgsExtensions - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool Is(this PropertyChangedEventArgs args, BindableProperty property) - { - return args.PropertyName == property.PropertyName; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1) - { - return args.PropertyName == p0.PropertyName || - args.PropertyName == p1.PropertyName; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1, BindableProperty p2) - { - return args.PropertyName == p0.PropertyName || - args.PropertyName == p1.PropertyName || - args.PropertyName == p2.PropertyName; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1, BindableProperty p2, BindableProperty p3) - { - return args.PropertyName == p0.PropertyName || - args.PropertyName == p1.PropertyName || - args.PropertyName == p2.PropertyName || - args.PropertyName == p3.PropertyName; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1, BindableProperty p2, BindableProperty p3, BindableProperty p4) - { - return args.PropertyName == p0.PropertyName || - args.PropertyName == p1.PropertyName || - args.PropertyName == p2.PropertyName || - args.PropertyName == p3.PropertyName || - args.PropertyName == p4.PropertyName; - } - } -} \ No newline at end of file diff --git a/src/Compatibility/Core/src/Windows/PropertyChangedEventArgsExtensions.cs b/src/Compatibility/Core/src/Windows/PropertyChangedEventArgsExtensions.cs deleted file mode 100644 index 89e0f916b2fd..000000000000 --- a/src/Compatibility/Core/src/Windows/PropertyChangedEventArgsExtensions.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.ComponentModel; -using System.Runtime.CompilerServices; - -namespace Microsoft.Maui.Controls.Compatibility.Platform.UWP -{ - internal static class PropertyChangedEventArgsExtensions - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool Is(this PropertyChangedEventArgs args, BindableProperty property) - { - return args.PropertyName == property.PropertyName; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1) - { - return args.PropertyName == p0.PropertyName || - args.PropertyName == p1.PropertyName; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1, BindableProperty p2) - { - return args.PropertyName == p0.PropertyName || - args.PropertyName == p1.PropertyName || - args.PropertyName == p2.PropertyName; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1, BindableProperty p2, BindableProperty p3) - { - return args.PropertyName == p0.PropertyName || - args.PropertyName == p1.PropertyName || - args.PropertyName == p2.PropertyName || - args.PropertyName == p3.PropertyName; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1, BindableProperty p2, BindableProperty p3, BindableProperty p4) - { - return args.PropertyName == p0.PropertyName || - args.PropertyName == p1.PropertyName || - args.PropertyName == p2.PropertyName || - args.PropertyName == p3.PropertyName || - args.PropertyName == p4.PropertyName; - } - } -} \ No newline at end of file diff --git a/src/Compatibility/Core/src/iOS/CollectionView/PropertyChangedEventArgsExtensions.cs b/src/Compatibility/Core/src/iOS/CollectionView/PropertyChangedEventArgsExtensions.cs deleted file mode 100644 index 75725799600a..000000000000 --- a/src/Compatibility/Core/src/iOS/CollectionView/PropertyChangedEventArgsExtensions.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.ComponentModel; -using System.Runtime.CompilerServices; - -namespace Microsoft.Maui.Controls.Compatibility.Platform.iOS -{ - internal static class PropertyChangedEventArgsExtensions - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool Is(this PropertyChangedEventArgs args, BindableProperty property) - { - return args.PropertyName == property.PropertyName; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1) - { - return args.PropertyName == p0.PropertyName || - args.PropertyName == p1.PropertyName; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1, BindableProperty p2) - { - return args.PropertyName == p0.PropertyName || - args.PropertyName == p1.PropertyName || - args.PropertyName == p2.PropertyName; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1, BindableProperty p2, BindableProperty p3) - { - return args.PropertyName == p0.PropertyName || - args.PropertyName == p1.PropertyName || - args.PropertyName == p2.PropertyName || - args.PropertyName == p3.PropertyName; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1, BindableProperty p2, BindableProperty p3, BindableProperty p4) - { - return args.PropertyName == p0.PropertyName || - args.PropertyName == p1.PropertyName || - args.PropertyName == p2.PropertyName || - args.PropertyName == p3.PropertyName || - args.PropertyName == p4.PropertyName; - } - } -} \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items/iOS/PropertyChangedEventArgsExtensions.cs b/src/Controls/src/Core/Handlers/Items/iOS/PropertyChangedEventArgsExtensions.cs deleted file mode 100644 index 0f316bd68663..000000000000 --- a/src/Controls/src/Core/Handlers/Items/iOS/PropertyChangedEventArgsExtensions.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.ComponentModel; -using System.Runtime.CompilerServices; - -namespace Microsoft.Maui.Controls.Handlers.Items -{ - internal static class PropertyChangedEventArgsExtensions - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool Is(this PropertyChangedEventArgs args, BindableProperty property) - { - return args.PropertyName == property.PropertyName; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1) - { - return args.PropertyName == p0.PropertyName || - args.PropertyName == p1.PropertyName; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1, BindableProperty p2) - { - return args.PropertyName == p0.PropertyName || - args.PropertyName == p1.PropertyName || - args.PropertyName == p2.PropertyName; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1, BindableProperty p2, BindableProperty p3) - { - return args.PropertyName == p0.PropertyName || - args.PropertyName == p1.PropertyName || - args.PropertyName == p2.PropertyName || - args.PropertyName == p3.PropertyName; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1, BindableProperty p2, BindableProperty p3, BindableProperty p4) - { - return args.PropertyName == p0.PropertyName || - args.PropertyName == p1.PropertyName || - args.PropertyName == p2.PropertyName || - args.PropertyName == p3.PropertyName || - args.PropertyName == p4.PropertyName; - } - } -} \ No newline at end of file diff --git a/src/Controls/src/Core/PropertyChangedEventArgsExtensions.cs b/src/Controls/src/Core/PropertyChangedEventArgsExtensions.cs index b22b66838deb..32dd4036931d 100644 --- a/src/Controls/src/Core/PropertyChangedEventArgsExtensions.cs +++ b/src/Controls/src/Core/PropertyChangedEventArgsExtensions.cs @@ -8,12 +8,18 @@ internal static class PropertyChangedEventArgsExtensions [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool Is(this PropertyChangedEventArgs args, BindableProperty property) { + if (string.IsNullOrEmpty(args.PropertyName)) + return true; + return args.PropertyName == property.PropertyName; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1) { + if (string.IsNullOrEmpty(args.PropertyName)) + return true; + return args.PropertyName == p0.PropertyName || args.PropertyName == p1.PropertyName; } @@ -21,6 +27,9 @@ public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1, BindableProperty p2) { + if (string.IsNullOrEmpty(args.PropertyName)) + return true; + return args.PropertyName == p0.PropertyName || args.PropertyName == p1.PropertyName || args.PropertyName == p2.PropertyName; @@ -29,6 +38,9 @@ public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1, BindableProperty p2, BindableProperty p3) { + if (string.IsNullOrEmpty(args.PropertyName)) + return true; + return args.PropertyName == p0.PropertyName || args.PropertyName == p1.PropertyName || args.PropertyName == p2.PropertyName || @@ -38,6 +50,9 @@ public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsOneOf(this PropertyChangedEventArgs args, BindableProperty p0, BindableProperty p1, BindableProperty p2, BindableProperty p3, BindableProperty p4) { + if (string.IsNullOrEmpty(args.PropertyName)) + return true; + return args.PropertyName == p0.PropertyName || args.PropertyName == p1.PropertyName || args.PropertyName == p2.PropertyName || diff --git a/src/Controls/tests/Core.UnitTests/PropertyChangedEventArgsExtensionsTests.cs b/src/Controls/tests/Core.UnitTests/PropertyChangedEventArgsExtensionsTests.cs new file mode 100644 index 000000000000..8153e6715748 --- /dev/null +++ b/src/Controls/tests/Core.UnitTests/PropertyChangedEventArgsExtensionsTests.cs @@ -0,0 +1,138 @@ +using System.ComponentModel; +using NUnit.Framework; + +namespace Microsoft.Maui.Controls.Core.UnitTests +{ + [TestFixture] + public class PropertyChangedEventArgsExtensionsTests : BaseTestFixture + { + [Test] + public void IsWithMathingStringValues() + { + PropertyChangedEventArgs args = new("MyProperty"); + BindableProperty bindable = BindableProperty.Create("MyProperty", typeof(object), typeof(object)); + + Assert.IsTrue(args.Is(bindable)); + } + + [Test] + public void IsWithNonMathingValues() + { + PropertyChangedEventArgs args = new("MyProperty"); + BindableProperty bindable = BindableProperty.Create("NotMyProperty", typeof(object), typeof(object)); + + Assert.IsFalse(args.Is(bindable)); + } + + [Test] + [TestCase("")] + [TestCase(null)] + public void IsWithNullOrEmptyValue(string changedPropertyName) + { + PropertyChangedEventArgs args = new(changedPropertyName); + BindableProperty bindable = BindableProperty.Create("MyProperty", typeof(object), typeof(object)); + + Assert.IsTrue(args.Is(bindable)); + } + + [Test] + public void IsOneOfTwoParameters() + { + PropertyChangedEventArgs args = new("MyProperty"); + BindableProperty bindable0 = BindableProperty.Create("MyProperty", typeof(object), typeof(object)); + BindableProperty bindable1 = BindableProperty.Create("AlsoMyProperty", typeof(object), typeof(object)); + + Assert.IsTrue(args.IsOneOf(bindable0, bindable1)); + } + + [Test] + public void IsOneOfThreeParameters() + { + PropertyChangedEventArgs args = new("MyProperty"); + BindableProperty bindable0 = BindableProperty.Create("MyProperty", typeof(object), typeof(object)); + BindableProperty bindable1 = BindableProperty.Create("AlsoMyProperty", typeof(object), typeof(object)); + BindableProperty bindable2 = BindableProperty.Create("AlsoMyProperty1", typeof(object), typeof(object)); + + Assert.IsTrue(args.IsOneOf(bindable0, bindable1, bindable2)); + } + + [Test] + public void IsOneOfFourParameters() + { + PropertyChangedEventArgs args = new("MyProperty"); + BindableProperty bindable0 = BindableProperty.Create("MyProperty", typeof(object), typeof(object)); + BindableProperty bindable1 = BindableProperty.Create("AlsoMyProperty", typeof(object), typeof(object)); + BindableProperty bindable2 = BindableProperty.Create("AlsoMyProperty1", typeof(object), typeof(object)); + BindableProperty bindable3 = BindableProperty.Create("NotMyProperty", typeof(object), typeof(object)); + + Assert.IsTrue(args.IsOneOf(bindable0, bindable1, bindable2, bindable3)); + } + + [Test] + public void IsOneOfFiveParameters() + { + PropertyChangedEventArgs args = new("MyProperty"); + BindableProperty bindable0 = BindableProperty.Create("MyProperty", typeof(object), typeof(object)); + BindableProperty bindable1 = BindableProperty.Create("AlsoMyProperty", typeof(object), typeof(object)); + BindableProperty bindable2 = BindableProperty.Create("AlsoMyProperty1", typeof(object), typeof(object)); + BindableProperty bindable3 = BindableProperty.Create("NotMyProperty", typeof(object), typeof(object)); + BindableProperty bindable4 = BindableProperty.Create("AlsNotMyProperty", typeof(object), typeof(object)); + + Assert.IsTrue(args.IsOneOf(bindable0, bindable1, bindable2, bindable3, bindable4)); + } + + [Test] + [TestCase("")] + [TestCase(null)] + public void IsOneOfTwoParametersNullOrEmptyValue(string changedPropertyName) + { + PropertyChangedEventArgs args = new(changedPropertyName); + BindableProperty bindable0 = BindableProperty.Create("MyProperty", typeof(object), typeof(object)); + BindableProperty bindable1 = BindableProperty.Create("AlsoMyProperty", typeof(object), typeof(object)); + + Assert.IsTrue(args.IsOneOf(bindable0, bindable1)); + } + + [Test] + [TestCase("")] + [TestCase(null)] + public void IsOneOfThreeParametersNullOrEmptyValue(string changedPropertyName) + { + PropertyChangedEventArgs args = new(changedPropertyName); + BindableProperty bindable0 = BindableProperty.Create("MyProperty", typeof(object), typeof(object)); + BindableProperty bindable1 = BindableProperty.Create("AlsoMyProperty", typeof(object), typeof(object)); + BindableProperty bindable2 = BindableProperty.Create("AlsoMyProperty1", typeof(object), typeof(object)); + + Assert.IsTrue(args.IsOneOf(bindable0, bindable1, bindable2)); + } + + [Test] + [TestCase("")] + [TestCase(null)] + public void IsOneOfFourParametersNullOrEmptyValue(string changedPropertyName) + { + PropertyChangedEventArgs args = new(changedPropertyName); + BindableProperty bindable0 = BindableProperty.Create("MyProperty", typeof(object), typeof(object)); + BindableProperty bindable1 = BindableProperty.Create("AlsoMyProperty", typeof(object), typeof(object)); + BindableProperty bindable2 = BindableProperty.Create("AlsoMyProperty1", typeof(object), typeof(object)); + BindableProperty bindable3 = BindableProperty.Create("NotMyProperty", typeof(object), typeof(object)); + + Assert.IsTrue(args.IsOneOf(bindable0, bindable1, bindable2, bindable3)); + } + + [Test] + [TestCase("")] + [TestCase(null)] + public void IsOneOfFiveParametersNullOrEmptyValue(string changedPropertyName) + { + PropertyChangedEventArgs args = new(changedPropertyName); + BindableProperty bindable0 = BindableProperty.Create("MyProperty", typeof(object), typeof(object)); + BindableProperty bindable1 = BindableProperty.Create("AlsoMyProperty", typeof(object), typeof(object)); + BindableProperty bindable2 = BindableProperty.Create("AlsoMyProperty1", typeof(object), typeof(object)); + BindableProperty bindable3 = BindableProperty.Create("NotMyProperty", typeof(object), typeof(object)); + BindableProperty bindable4 = BindableProperty.Create("AlsNotMyProperty", typeof(object), typeof(object)); + + Assert.IsTrue(args.IsOneOf(bindable0, bindable1, bindable2, bindable3, bindable4)); + } + } +}