Browse Source

Traverse transform nodes in the correct order when setting a binding source value.

pull/3001/head
Jeremy Koritzinsky 7 years ago
parent
commit
590f5923a8
  1. 32
      src/Avalonia.Base/Data/Core/ExpressionObserver.cs

32
src/Avalonia.Base/Data/Core/ExpressionObserver.cs

@ -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);
} }

Loading…
Cancel
Save