From 85734f1a47e50ef315ecfb4b34c348719256bd9d Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Thu, 11 May 2023 09:42:23 +0200 Subject: [PATCH 1/2] feat: Binding StringFormat without curly braces --- .../Data/Converters/StringFormatValueConverter.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Base/Data/Converters/StringFormatValueConverter.cs b/src/Avalonia.Base/Data/Converters/StringFormatValueConverter.cs index 5307ea4b9a..88cd1f38af 100644 --- a/src/Avalonia.Base/Data/Converters/StringFormatValueConverter.cs +++ b/src/Avalonia.Base/Data/Converters/StringFormatValueConverter.cs @@ -35,7 +35,12 @@ namespace Avalonia.Data.Converters public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { value = Inner?.Convert(value, targetType, parameter, culture) ?? value; - return string.Format(culture, Format, value); + var format = Format!; + if (!format.Contains('{')) + { + format = $"{{0:{format}}}"; + } + return string.Format(culture, format, value); } /// From 20971097caedf0153c358e55b1e0ec6507e040d7 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Thu, 11 May 2023 09:42:58 +0200 Subject: [PATCH 2/2] test: Binding StringFormat without curly braces --- .../CompiledBindingExtensionTests.cs | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs index 9f0b84733d..60faed2c3f 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs @@ -1795,7 +1795,33 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions Assert.Equal(123, comboBox.SelectedItem); } } - + + [Theory] + [InlineData(false)] + [InlineData(true)] + public void Should_Use_StringFormat_Without_Braces(bool compileBindings) + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var xaml = $@" + + +"; + var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); + var textBlock = window.FindControl("textBlock"); + + var dataContext = new TestDataContext(); + window.DataContext = dataContext; + + Assert.Equal(string.Format("{0:c2}", TestDataContext.ExpectedDecimal) + , textBlock.GetValue(TextBlock.TextProperty)); + } + } + static void Throws(string type, Action cb) { try @@ -1891,7 +1917,10 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions public static string StaticProperty => "World"; public ListItemCollectionView GenericProperty { get; } = new(); - + + public const decimal ExpectedDecimal = 15.756m; + public decimal DecimalValue { get; set; } = ExpectedDecimal; + public class NonIntegerIndexer : NotifyingBase, INonIntegerIndexerDerived { private readonly Dictionary _storage = new Dictionary();