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

Loading…
Cancel
Save