Browse Source

Refactored common code into separate method.

pull/10324/head
Steven Kirk 4 years ago
parent
commit
5d66bd0c0e
  1. 59
      src/Avalonia.Base/StyledProperty.cs

59
src/Avalonia.Base/StyledProperty.cs

@ -194,45 +194,48 @@ namespace Avalonia
} }
/// <inheritdoc/> /// <inheritdoc/>
[UnconditionalSuppressMessage("Trimming", "IL2026", Justification = TrimmingMessages.ImplicitTypeConvertionSupressWarningMessage)]
internal override IDisposable? RouteSetValue( internal override IDisposable? RouteSetValue(
AvaloniaObject target, AvaloniaObject target,
object? value, object? value,
BindingPriority priority) BindingPriority priority)
{ {
if (value == BindingOperations.DoNothing) if (ShouldSetValue(target, value, out var converted))
{ return target.SetValue<TValue>(this, converted, priority);
return null; 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})");
}
} }
[UnconditionalSuppressMessage("Trimming", "IL2026", Justification = TrimmingMessages.ImplicitTypeConvertionSupressWarningMessage)]
internal override void RouteSetCurrentValue(AvaloniaObject target, object? value) internal override void RouteSetCurrentValue(AvaloniaObject target, object? value)
{ {
if (value == BindingOperations.DoNothing) if (ShouldSetValue(target, value, out var converted))
return; 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) if (value == UnsetValue)
{ {
target.ClearValue(this); 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 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) private object? GetDefaultBoxedValue(Type type)
{ {
_ = type ?? throw new ArgumentNullException(nameof(type)); _ = type ?? throw new ArgumentNullException(nameof(type));

Loading…
Cancel
Save