|
|
|
@ -194,45 +194,48 @@ namespace Avalonia |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
[UnconditionalSuppressMessage("Trimming", "IL2026", Justification = TrimmingMessages.ImplicitTypeConvertionSupressWarningMessage)] |
|
|
|
internal override IDisposable? RouteSetValue( |
|
|
|
AvaloniaObject target, |
|
|
|
object? value, |
|
|
|
BindingPriority priority) |
|
|
|
{ |
|
|
|
if (value == BindingOperations.DoNothing) |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
else if (value == UnsetValue) |
|
|
|
{ |
|
|
|
target.ClearValue(this); |
|
|
|
return null; |
|
|
|
} |
|
|
|
else if (TypeUtilities.TryConvertImplicit(PropertyType, value, out var converted)) |
|
|
|
{ |
|
|
|
return target.SetValue<TValue>(this, (TValue)converted!, priority); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
var type = value?.GetType().FullName ?? "(null)"; |
|
|
|
throw new ArgumentException($"Invalid value for Property '{Name}': '{value}' ({type})"); |
|
|
|
} |
|
|
|
if (ShouldSetValue(target, value, out var converted)) |
|
|
|
return target.SetValue<TValue>(this, converted, priority); |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
[UnconditionalSuppressMessage("Trimming", "IL2026", Justification = TrimmingMessages.ImplicitTypeConvertionSupressWarningMessage)] |
|
|
|
internal override void RouteSetCurrentValue(AvaloniaObject target, object? value) |
|
|
|
{ |
|
|
|
if (value == BindingOperations.DoNothing) |
|
|
|
return; |
|
|
|
if (ShouldSetValue(target, value, out var converted)) |
|
|
|
target.SetCurrentValue<TValue>(this, converted); |
|
|
|
} |
|
|
|
|
|
|
|
internal override IDisposable RouteBind( |
|
|
|
AvaloniaObject target, |
|
|
|
IObservable<object?> source, |
|
|
|
BindingPriority priority) |
|
|
|
{ |
|
|
|
return target.Bind<TValue>(this, source, priority); |
|
|
|
} |
|
|
|
|
|
|
|
[UnconditionalSuppressMessage("Trimming", "IL2026", Justification = TrimmingMessages.ImplicitTypeConvertionSupressWarningMessage)] |
|
|
|
private bool ShouldSetValue(AvaloniaObject target, object? value, [NotNullWhen(true)] out TValue? converted) |
|
|
|
{ |
|
|
|
if (value == BindingOperations.DoNothing) |
|
|
|
{ |
|
|
|
converted = default; |
|
|
|
return false; |
|
|
|
} |
|
|
|
if (value == UnsetValue) |
|
|
|
{ |
|
|
|
target.ClearValue(this); |
|
|
|
converted = default; |
|
|
|
return false; |
|
|
|
} |
|
|
|
else if (TypeUtilities.TryConvertImplicit(PropertyType, value, out var converted)) |
|
|
|
else if (TypeUtilities.TryConvertImplicit(PropertyType, value, out var v)) |
|
|
|
{ |
|
|
|
target.SetCurrentValue<TValue>(this, (TValue)converted!); |
|
|
|
converted = (TValue)v!; |
|
|
|
return true; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
@ -241,14 +244,6 @@ namespace Avalonia |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
internal override IDisposable RouteBind( |
|
|
|
AvaloniaObject target, |
|
|
|
IObservable<object?> source, |
|
|
|
BindingPriority priority) |
|
|
|
{ |
|
|
|
return target.Bind<TValue>(this, source, priority); |
|
|
|
} |
|
|
|
|
|
|
|
private object? GetDefaultBoxedValue(Type type) |
|
|
|
{ |
|
|
|
_ = type ?? throw new ArgumentNullException(nameof(type)); |
|
|
|
|