diff --git a/src/Avalonia.Base/Media/Geometry.cs b/src/Avalonia.Base/Media/Geometry.cs
index 9ef32c7d09..ab1bb3b9fa 100644
--- a/src/Avalonia.Base/Media/Geometry.cs
+++ b/src/Avalonia.Base/Media/Geometry.cs
@@ -1,12 +1,16 @@
using System;
using Avalonia.Platform;
+using System.ComponentModel;
+using System.Globalization;
using Avalonia.Reactive;
+
namespace Avalonia.Media
{
///
/// Defines a geometric shape.
- ///
+ ///
+ [TypeConverter(typeof(GeometryTypeConverter))]
public abstract class Geometry : AvaloniaObject
{
///
@@ -201,4 +205,32 @@ namespace Avalonia.Media
return new CombinedGeometry(combineMode, geometry1, geometry2, transform);
}
}
+
+ public class GeometryTypeConverter : TypeConverter
+ {
+ public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType)
+ {
+ if (sourceType == typeof(string))
+ {
+ return true;
+ }
+ return base.CanConvertFrom(context, sourceType);
+ }
+
+ public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value)
+ {
+ if (value is null)
+ {
+ throw GetConvertFromException(value);
+ }
+ string? source = value as string;
+
+ if (source != null)
+ {
+ return Geometry.Parse(source);
+ }
+
+ return base.ConvertFrom(context, culture, value);
+ }
+ }
}
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/GeometryTypeConverterTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/GeometryTypeConverterTests.cs
new file mode 100644
index 0000000000..329a14afa6
--- /dev/null
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/GeometryTypeConverterTests.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Avalonia.Controls;
+using Avalonia.Controls.Shapes;
+using Avalonia.Media;
+using Avalonia.UnitTests;
+using Xunit;
+
+namespace Avalonia.Markup.Xaml.UnitTests.Converters
+{
+ public class GeometryTypeConverterTests: XamlTestBase
+ {
+ public class StringDataViewModel
+ {
+ public string PathData { get; set; }
+ }
+
+ public class IntDataViewModel
+ {
+ public int PathData { get; set; }
+ }
+
+
+ [Theory]
+ [MemberData(nameof(Get_GeometryTypeConverter_Data))]
+ public void GeometryTypeConverter_Value_Work(object vm, bool nullData)
+ {
+ using(UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var xaml = @"
+
+
+";
+ var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
+ var path = window.FindControl("path");
+ window.DataContext = vm;
+ Assert.Equal(nullData, path.Data is null);
+ }
+ }
+
+ public static IEnumerable