4 changed files with 106 additions and 18 deletions
@ -0,0 +1,74 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Diagnostics; |
||||
|
using System.Reflection; |
||||
|
using System.Text; |
||||
|
using Avalonia.Data; |
||||
|
using Avalonia.Data.Core.Plugins; |
||||
|
|
||||
|
#nullable enable |
||||
|
|
||||
|
namespace Avalonia.Markup.Xaml.MarkupExtensions.CompiledBindings |
||||
|
{ |
||||
|
internal class MethodAccessorPlugin : IPropertyAccessorPlugin |
||||
|
{ |
||||
|
private MethodInfo _method; |
||||
|
private readonly Type _delegateType; |
||||
|
|
||||
|
public MethodAccessorPlugin(MethodInfo method, Type delegateType) |
||||
|
{ |
||||
|
_method = method; |
||||
|
_delegateType = delegateType; |
||||
|
} |
||||
|
|
||||
|
public bool Match(object obj, string propertyName) |
||||
|
{ |
||||
|
throw new InvalidOperationException("The MethodAccessorPlugin does not support dynamic matching"); |
||||
|
} |
||||
|
|
||||
|
public IPropertyAccessor Start(WeakReference<object?> reference, string propertyName) |
||||
|
{ |
||||
|
Debug.Assert(_method.Name == propertyName); |
||||
|
return new Accessor(reference, _method, _delegateType); |
||||
|
} |
||||
|
|
||||
|
private sealed class Accessor : PropertyAccessorBase |
||||
|
{ |
||||
|
public Accessor(WeakReference<object?> reference, MethodInfo method, Type delegateType) |
||||
|
{ |
||||
|
_ = reference ?? throw new ArgumentNullException(nameof(reference)); |
||||
|
_ = method ?? throw new ArgumentNullException(nameof(method)); |
||||
|
|
||||
|
PropertyType = delegateType; |
||||
|
|
||||
|
if (method.IsStatic) |
||||
|
{ |
||||
|
Value = method.CreateDelegate(PropertyType); |
||||
|
} |
||||
|
else if (reference.TryGetTarget(out var target)) |
||||
|
{ |
||||
|
Value = method.CreateDelegate(PropertyType, target); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public override Type? PropertyType { get; } |
||||
|
|
||||
|
public override object? Value { get; } |
||||
|
|
||||
|
public override bool SetValue(object? value, BindingPriority priority) => false; |
||||
|
|
||||
|
protected override void SubscribeCore() |
||||
|
{ |
||||
|
try |
||||
|
{ |
||||
|
PublishValue(Value); |
||||
|
} |
||||
|
catch { } |
||||
|
} |
||||
|
|
||||
|
protected override void UnsubscribeCore() |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue