From 553cd0124e16fd4494d07f7bbcba17420cb02448 Mon Sep 17 00:00:00 2001 From: Gustavo Oliveira Date: Sun, 18 Apr 2021 19:16:03 +1000 Subject: [PATCH 1/4] Added EnumToListConverter --- .../Converters/EnumToListConverterPage.xaml | 40 +++++++++++++++++++ .../EnumToListConverterPage.xaml.cs | 10 +++++ .../Converters/ConvertersGalleryViewModel.cs | 6 ++- .../EnumToListConverterViewModel.cs | 25 ++++++++++++ .../Converters/StringToListConverter_Tests.cs | 8 ++-- .../Converters/EnumToListConverter.shared.cs | 40 +++++++++++++++++++ .../EnumToStringConverter.shared.cs | 40 +++++++++++++++++++ 7 files changed, 164 insertions(+), 5 deletions(-) create mode 100644 samples/XCT.Sample/Pages/Converters/EnumToListConverterPage.xaml create mode 100644 samples/XCT.Sample/Pages/Converters/EnumToListConverterPage.xaml.cs create mode 100644 samples/XCT.Sample/ViewModels/Converters/EnumToListConverterViewModel.cs create mode 100644 src/CommunityToolkit/Xamarin.CommunityToolkit/Converters/EnumToListConverter.shared.cs create mode 100644 src/CommunityToolkit/Xamarin.CommunityToolkit/Converters/EnumToStringConverter.shared.cs diff --git a/samples/XCT.Sample/Pages/Converters/EnumToListConverterPage.xaml b/samples/XCT.Sample/Pages/Converters/EnumToListConverterPage.xaml new file mode 100644 index 000000000..361a50a40 --- /dev/null +++ b/samples/XCT.Sample/Pages/Converters/EnumToListConverterPage.xaml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + diff --git a/samples/XCT.Sample/Pages/Converters/EnumToListConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/EnumToListConverterPage.xaml.cs new file mode 100644 index 000000000..937bb5667 --- /dev/null +++ b/samples/XCT.Sample/Pages/Converters/EnumToListConverterPage.xaml.cs @@ -0,0 +1,10 @@ +namespace Xamarin.CommunityToolkit.Sample.Pages.Converters +{ + public partial class EnumToListConverterPage : BasePage + { + public EnumToListConverterPage() + { + InitializeComponent(); + } + } +} diff --git a/samples/XCT.Sample/ViewModels/Converters/ConvertersGalleryViewModel.cs b/samples/XCT.Sample/ViewModels/Converters/ConvertersGalleryViewModel.cs index e00a633b1..0591e079a 100644 --- a/samples/XCT.Sample/ViewModels/Converters/ConvertersGalleryViewModel.cs +++ b/samples/XCT.Sample/ViewModels/Converters/ConvertersGalleryViewModel.cs @@ -95,10 +95,14 @@ protected override IEnumerable CreateItems() => new[] typeof(MathExpressionConverterPage), nameof(MathExpressionConverter), "A converter that allows users to calculate an expression at runtime."), - new SectionModel( + new SectionModel( typeof(StringToListConverterPage), nameof(StringToListConverter), "A converter that splits a string by the separator and returns the enumerable sequence of strings as the result."), + new SectionModel( + typeof(EnumToListConverterPage), + nameof(EnumToListConverter), + "A converter that returns the enumerable sequence of enum as the result."), new SectionModel( typeof(CompareConverterPage), nameof(CompareConverter), diff --git a/samples/XCT.Sample/ViewModels/Converters/EnumToListConverterViewModel.cs b/samples/XCT.Sample/ViewModels/Converters/EnumToListConverterViewModel.cs new file mode 100644 index 000000000..aad33ba4e --- /dev/null +++ b/samples/XCT.Sample/ViewModels/Converters/EnumToListConverterViewModel.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using Xamarin.CommunityToolkit.Behaviors; +using Xamarin.CommunityToolkit.UI.Views; + +namespace Xamarin.CommunityToolkit.Sample.ViewModels.Converters +{ + public class EnumToListConverterViewModel : BaseViewModel + { + List enumTypes = new List() { typeof(BadgePosition), typeof(CameraCaptureMode), typeof(CharacterType) }; + Type? selectedItem = null; + + public List EnumTypes + { + get => enumTypes; + set => SetProperty(ref enumTypes, value); + } + + public Type? SelectedItem + { + get => selectedItem; + set => SetProperty(ref selectedItem, value); + } + } +} \ No newline at end of file diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/StringToListConverter_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/StringToListConverter_Tests.cs index fb45ed521..6dd9b02e5 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/StringToListConverter_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/StringToListConverter_Tests.cs @@ -32,17 +32,17 @@ public void StringToListConverter(object value, object parameter, object expecte [TestCase(0)] public void InValidConverterValuesThrowArgumenException(object value) { - var listToStringConverter = new ListToStringConverter(); + var stringToListConverter = new StringToListConverter(); - Assert.Throws(() => listToStringConverter.Convert(value, null, null, null)); + Assert.Throws(() => stringToListConverter.Convert(value, null, null, null)); } [TestCase(0)] public void InValidConverterParametersThrowArgumenException(object parameter) { - var listToStringConverter = new ListToStringConverter(); + var stringToListConverter = new StringToListConverter(); - Assert.Throws(() => listToStringConverter.Convert(new object[0], null, parameter, null)); + Assert.Throws(() => stringToListConverter.Convert(new object[0], null, parameter, null)); } } } \ No newline at end of file diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit/Converters/EnumToListConverter.shared.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit/Converters/EnumToListConverter.shared.cs new file mode 100644 index 000000000..a7638c793 --- /dev/null +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit/Converters/EnumToListConverter.shared.cs @@ -0,0 +1,40 @@ +using System; +using System.Globalization; +using Xamarin.CommunityToolkit.Extensions.Internals; +using Xamarin.Forms; + +namespace Xamarin.CommunityToolkit.Converters +{ + /// + /// A converter that returns the enumerable sequence of enum as the result. + /// + public class EnumToListConverter : ValueConverterExtension, IValueConverter + { + /// + /// Returns a string array that contains the substrings in this string that are delimited by . + /// + /// The string to split. + /// The type of the binding target property. This is not implemented. + /// The string or strings that delimits the substrings in this string. This overrides the value in and . + /// The culture to use in the converter. This is not implemented. + /// An array whose elements contain the substrings in this string that are delimited by or, if set, or, if set, . + public object? Convert(object? value, Type? targetType, object? parameter, CultureInfo? culture) + { + if (value is Type type) + return Enum.GetValues(type); + + return new string[] { }; + } + + /// + /// This method is not implemented and will throw a . + /// + /// N/A + /// N/A + /// N/A + /// N/A + /// N/A + public object? ConvertBack(object? value, Type? targetType, object? parameter, CultureInfo? culture) + => throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit/Converters/EnumToStringConverter.shared.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit/Converters/EnumToStringConverter.shared.cs new file mode 100644 index 000000000..c154a8134 --- /dev/null +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit/Converters/EnumToStringConverter.shared.cs @@ -0,0 +1,40 @@ +using System; +using System.Globalization; +using Xamarin.CommunityToolkit.Extensions.Internals; +using Xamarin.Forms; + +namespace Xamarin.CommunityToolkit.Converters +{ + /// + /// A converter that returns the enumerable sequence of enum as the result. + /// + public class EnumToStringConverter : ValueConverterExtension, IValueConverter + { + /// + /// Returns a string array that contains the substrings in this string that are delimited by . + /// + /// The string to split. + /// The type of the binding target property. This is not implemented. + /// The string or strings that delimits the substrings in this string. This overrides the value in and . + /// The culture to use in the converter. This is not implemented. + /// An array whose elements contain the substrings in this string that are delimited by or, if set, or, if set, . + public object? Convert(object value, Type? targetType, object? parameter, CultureInfo? culture) + { + if (value is Type type) + return type.Name; + + return string.Empty; + } + + /// + /// This method is not implemented and will throw a . + /// + /// N/A + /// N/A + /// N/A + /// N/A + /// N/A + public object? ConvertBack(object? value, Type? targetType, object? parameter, CultureInfo? culture) + => throw new NotImplementedException(); + } +} \ No newline at end of file From 03660e50469fa575b9baf950d22a9fdfaaf3af42 Mon Sep 17 00:00:00 2001 From: Gustavo Oliveira Date: Thu, 1 Jul 2021 13:09:45 +1000 Subject: [PATCH 2/4] Added EnumToListConverter --- samples/XCT.Sample.iOS/Info.plist | 2 +- .../Converters/EnumToListConverterPage.xaml | 28 +++++++++++++++-- .../EnumToListConverterViewModel.cs | 31 +++++++++++++++++-- .../Converters/EnumToListConverter.shared.cs | 26 ++++++++++------ 4 files changed, 71 insertions(+), 16 deletions(-) diff --git a/samples/XCT.Sample.iOS/Info.plist b/samples/XCT.Sample.iOS/Info.plist index f2a1df10d..b27e21f84 100644 --- a/samples/XCT.Sample.iOS/Info.plist +++ b/samples/XCT.Sample.iOS/Info.plist @@ -21,7 +21,7 @@ UIInterfaceOrientationLandscapeRight MinimumOSVersion - 13.6 + 14.0 CFBundleDisplayName XamarinCommunityToolkitSample CFBundleIdentifier diff --git a/samples/XCT.Sample/Pages/Converters/EnumToListConverterPage.xaml b/samples/XCT.Sample/Pages/Converters/EnumToListConverterPage.xaml index 361a50a40..5e2a83e5b 100644 --- a/samples/XCT.Sample/Pages/Converters/EnumToListConverterPage.xaml +++ b/samples/XCT.Sample/Pages/Converters/EnumToListConverterPage.xaml @@ -16,21 +16,43 @@ - +