From 5ab8604436de66f521efc219fef035e94a844377 Mon Sep 17 00:00:00 2001 From: zacfromaustinpowder <165237243+zacfromaustinpowder@users.noreply.github.com> Date: Thu, 13 Nov 2025 18:50:03 +1000 Subject: [PATCH] Added an optional "ConvertBack" method to FuncValueConverter (#19920) --- .../Data/Converters/FuncValueConverter.cs | 56 +++++++++++++++++-- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Base/Data/Converters/FuncValueConverter.cs b/src/Avalonia.Base/Data/Converters/FuncValueConverter.cs index 0d446d0729..4ae6db0ea5 100644 --- a/src/Avalonia.Base/Data/Converters/FuncValueConverter.cs +++ b/src/Avalonia.Base/Data/Converters/FuncValueConverter.cs @@ -13,16 +13,28 @@ namespace Avalonia.Data.Converters public class FuncValueConverter : IValueConverter { private readonly Func _convert; + private readonly Func? _convertBack; /// /// Initializes a new instance of the class. /// - /// The convert function. + /// The function to convert TIn to TOut. public FuncValueConverter(Func convert) { _convert = convert; } + /// + /// Initializes a new instance of the class. + /// + /// The function to convert TIn to TOut. + /// The function to convert TOut back to In. + public FuncValueConverter(Func convert, Func? convertBack) + { + _convert = convert; + _convertBack = convertBack; + } + /// public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { @@ -39,7 +51,19 @@ namespace Avalonia.Data.Converters /// public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) { - throw new NotImplementedException(); + if (_convertBack == null) + { + throw new NotImplementedException(); + } + + if (TypeUtilities.CanCast(value)) + { + return _convertBack((TOut?)value); + } + else + { + return AvaloniaProperty.UnsetValue; + } } } @@ -53,16 +77,28 @@ namespace Avalonia.Data.Converters public class FuncValueConverter : IValueConverter { private readonly Func _convert; + private readonly Func? _convertBack; /// /// Initializes a new instance of the class. /// - /// The convert function. + /// The function to convert TIn to TOut. public FuncValueConverter(Func convert) { _convert = convert; } + /// + /// Initializes a new instance of the class. + /// + /// The function to convert TIn to TOut. + /// The function to convert TOut back to In. + public FuncValueConverter(Func convert, Func? convertBack = null) + { + _convert = convert; + _convertBack = convertBack; + } + /// public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { @@ -79,7 +115,19 @@ namespace Avalonia.Data.Converters /// public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) { - throw new NotImplementedException(); + if (_convertBack == null) + { + throw new NotImplementedException(); + } + + if (TypeUtilities.CanCast(value) && TypeUtilities.CanCast(parameter)) + { + return _convertBack((TOut?)value, (TParam?)parameter); + } + else + { + return AvaloniaProperty.UnsetValue; + } } } }