|
|
|
@ -52,9 +52,11 @@ namespace Avalonia.Data.Core.Plugins |
|
|
|
|
|
|
|
private class Accessor : PropertyAccessorBase, IWeakSubscriber<PropertyChangedEventArgs> |
|
|
|
{ |
|
|
|
private static readonly object CacheInvalid = new object(); |
|
|
|
private readonly WeakReference _reference; |
|
|
|
private readonly PropertyInfo _property; |
|
|
|
private bool _eventRaised; |
|
|
|
private object _lastValue = CacheInvalid; |
|
|
|
|
|
|
|
public Accessor(WeakReference reference, PropertyInfo property) |
|
|
|
{ |
|
|
|
@ -72,7 +74,7 @@ namespace Avalonia.Data.Core.Plugins |
|
|
|
get |
|
|
|
{ |
|
|
|
var o = _reference.Target; |
|
|
|
return (o != null) ? _property.GetValue(o) : null; |
|
|
|
return (_lastValue = (o != null) ? _property.GetValue(o) : null); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -80,6 +82,11 @@ namespace Avalonia.Data.Core.Plugins |
|
|
|
{ |
|
|
|
if (_property.CanWrite) |
|
|
|
{ |
|
|
|
if (!ShouldSet(value)) |
|
|
|
{ |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
_eventRaised = false; |
|
|
|
_property.SetValue(_reference.Target, value); |
|
|
|
|
|
|
|
@ -94,11 +101,24 @@ namespace Avalonia.Data.Core.Plugins |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
private bool ShouldSet(object value) |
|
|
|
{ |
|
|
|
if (PropertyType.IsValueType) |
|
|
|
{ |
|
|
|
return !_lastValue.Equals(value); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
return !Object.ReferenceEquals(_lastValue, value); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void IWeakSubscriber<PropertyChangedEventArgs>.OnEvent(object sender, PropertyChangedEventArgs e) |
|
|
|
{ |
|
|
|
if (e.PropertyName == _property.Name || string.IsNullOrEmpty(e.PropertyName)) |
|
|
|
{ |
|
|
|
_eventRaised = true; |
|
|
|
_lastValue = CacheInvalid; |
|
|
|
SendCurrentValue(); |
|
|
|
} |
|
|
|
} |
|
|
|
|