diff --git a/StabilityMatrix.Avalonia/MarkupExtensions/TernaryExtension.cs b/StabilityMatrix.Avalonia/MarkupExtensions/TernaryExtension.cs new file mode 100644 index 00000000..2654cccc --- /dev/null +++ b/StabilityMatrix.Avalonia/MarkupExtensions/TernaryExtension.cs @@ -0,0 +1,42 @@ +using System; +using System.Globalization; +using Avalonia.Data; +using Avalonia.Data.Converters; +using Avalonia.Markup.Xaml; +using Avalonia.Markup.Xaml.MarkupExtensions; + +namespace StabilityMatrix.Avalonia.MarkupExtensions; + +/// +/// https://github.com/AvaloniaUI/Avalonia/discussions/7408 +/// +/// +/// {e:Ternary SomeProperty, True=1, False=0} +/// +public class TernaryExtension : MarkupExtension +{ + public string Path { get; set; } + + public Type Type { get; set; } + + public object? True { get; set; } + + public object? False { get; set; } + + public override object ProvideValue(IServiceProvider serviceProvider) + { + var cultureInfo = CultureInfo.GetCultureInfo("en-US"); + var binding = new ReflectionBindingExtension(Path) + { + Mode = BindingMode.OneWay, + Converter = new FuncValueConverter( + isTrue => + isTrue + ? Convert.ChangeType(True, Type, cultureInfo.NumberFormat) + : Convert.ChangeType(False, Type, cultureInfo.NumberFormat) + ) + }; + + return binding.ProvideValue(serviceProvider); + } +}