|
|
@ -57,6 +57,7 @@ namespace Avalonia.Data.Core |
|
|
private object _root; |
|
|
private object _root; |
|
|
private IDisposable _rootSubscription; |
|
|
private IDisposable _rootSubscription; |
|
|
private WeakReference<object> _value; |
|
|
private WeakReference<object> _value; |
|
|
|
|
|
private IReadOnlyList<ITransformNode> _transformNodes; |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// Initializes a new instance of the <see cref="ExpressionObserver"/> class.
|
|
|
/// Initializes a new instance of the <see cref="ExpressionObserver"/> class.
|
|
|
@ -191,6 +192,24 @@ namespace Avalonia.Data.Core |
|
|
description ?? expression.ToString()); |
|
|
description ?? expression.ToString()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private IReadOnlyList<ITransformNode> GetTransformNodesFromChain() |
|
|
|
|
|
{ |
|
|
|
|
|
LinkedList<ITransformNode> transforms = new LinkedList<ITransformNode>(); |
|
|
|
|
|
var node = _node; |
|
|
|
|
|
while (node != null) |
|
|
|
|
|
{ |
|
|
|
|
|
if (node is ITransformNode transform) |
|
|
|
|
|
{ |
|
|
|
|
|
transforms.AddFirst(transform); |
|
|
|
|
|
} |
|
|
|
|
|
node = node.Next; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return new List<ITransformNode>(transforms); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private IReadOnlyList<ITransformNode> TransformNodes => (_transformNodes ?? (_transformNodes = GetTransformNodesFromChain())); |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// Attempts to set the value of a property expression.
|
|
|
/// Attempts to set the value of a property expression.
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
@ -206,18 +225,13 @@ namespace Avalonia.Data.Core |
|
|
{ |
|
|
{ |
|
|
if (Leaf is SettableNode settable) |
|
|
if (Leaf is SettableNode settable) |
|
|
{ |
|
|
{ |
|
|
var node = _node; |
|
|
foreach (var transform in TransformNodes) |
|
|
while (node != null) |
|
|
|
|
|
{ |
|
|
{ |
|
|
if (node is ITransformNode transform) |
|
|
value = transform.Transform(value); |
|
|
|
|
|
if (value is BindingNotification) |
|
|
{ |
|
|
{ |
|
|
value = transform.Transform(value); |
|
|
return false; |
|
|
if (value is BindingNotification) |
|
|
|
|
|
{ |
|
|
|
|
|
return false; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
node = node.Next; |
|
|
|
|
|
} |
|
|
} |
|
|
return settable.SetTargetValue(value, priority); |
|
|
return settable.SetTargetValue(value, priority); |
|
|
} |
|
|
} |
|
|
|