diff --git a/samples/XCT.Sample/Pages/Converters/EnumToListConverterPage.xaml b/samples/XCT.Sample/Pages/Converters/EnumToListConverterPage.xaml new file mode 100644 index 000000000..5fe908569 --- /dev/null +++ b/samples/XCT.Sample/Pages/Converters/EnumToListConverterPage.xaml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + 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 b18452a3d..36c874798 100644 --- a/samples/XCT.Sample/ViewModels/Converters/ConvertersGalleryViewModel.cs +++ b/samples/XCT.Sample/ViewModels/Converters/ConvertersGalleryViewModel.cs @@ -107,6 +107,10 @@ protected override IEnumerable CreateItems() => new[] 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..51208f07f --- /dev/null +++ b/samples/XCT.Sample/ViewModels/Converters/EnumToListConverterViewModel.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Xamarin.CommunityToolkit.Behaviors; +using Xamarin.CommunityToolkit.UI.Views; +using Xamarin.Forms; + +namespace Xamarin.CommunityToolkit.Sample.ViewModels.Converters +{ + public enum CustomEnum + { + A, + B, + C, + D, + E, + F + } + + public class EnumToListConverterViewModel : BaseViewModel + { + List enumTypes; + Type? selectedEnumType; + object? selectedItem = null; + + public EnumToListConverterViewModel() + { + enumTypes = new List() { typeof(CustomEnum), typeof(BadgePosition), typeof(CameraCaptureMode), typeof(CharacterType) }; + selectedEnumType = enumTypes.FirstOrDefault(); + } + + public List EnumTypes + { + get => enumTypes; + set => SetProperty(ref enumTypes, value); + } + + public Type? SelectedEnumType + { + get => selectedEnumType; + set => SetProperty(ref selectedEnumType, value); + } + + public object? 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 6324cb11b..40ef343c5 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..8ba398135 --- /dev/null +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit/Converters/EnumToListConverter.shared.cs @@ -0,0 +1,39 @@ +using System; +using System.Globalization; +using Xamarin.CommunityToolkit.Extensions.Internals; +using Xamarin.Forms; + +namespace Xamarin.CommunityToolkit.Converters +{ + /// + /// A converter that retrieves an array of the values of the constants in a specified enumeration. + /// + public class EnumToListConverter : ValueConverterExtension, IValueConverter + { + /// + /// Retrieves an array of the values of the constants in a specified enumeration. + /// + /// The Enum. + /// The type of the binding target property. This is not implemented. + /// Additional parameter for the converter to handle. This is not implemented. + /// The culture to use in the converter. This is not implemented. + /// An array that contains the values of the constants in . + public object? Convert(object? value, Type? targetType, object? parameter, CultureInfo? culture) + { + if (value is Type type) + return Enum.GetValues(type); + return value; + } + + /// + /// 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/ObjectToNameConverter.shared.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit/Converters/ObjectToNameConverter.shared.cs new file mode 100644 index 000000000..d1f19fb2d --- /dev/null +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit/Converters/ObjectToNameConverter.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 name of the object. + /// + public class ObjectToNameConverter : ValueConverterExtension, IValueConverter + { + /// + /// Returns the name of the name of the object. + /// + /// 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