diff --git a/src/Markup/Avalonia.Markup.Xaml/Templates/MemberSelector.cs b/src/Markup/Avalonia.Markup.Xaml/Templates/MemberSelector.cs index 6836dbf9df..c04bc5ece9 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Templates/MemberSelector.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Templates/MemberSelector.cs @@ -1,20 +1,47 @@ -// Copyright (c) The Avalonia Project. All rights reserved. +// Copyright (c) The Avalonia Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. -using System.Reflection; using Avalonia.Controls.Templates; +using Avalonia.Markup.Data; +using System; namespace Avalonia.Markup.Xaml.Templates { public class MemberSelector : IMemberSelector { - public string MemberName { get; set; } + public string MemberName + { + get { return _memberName; } + set + { + if (_memberName != value) + { + _memberName = value; + _expressionNode = null; + _memberValueNode = null; + } + } + } public object Select(object o) { - // TODO: Handle nested property paths, changing values etc. - var property = o.GetType().GetRuntimeProperty(MemberName); - return property?.GetValue(o); + if (_expressionNode == null) + { + _expressionNode = ExpressionNodeBuilder.Build(MemberName); + + _memberValueNode = _expressionNode; + + while (_memberValueNode.Next != null) + _memberValueNode = _memberValueNode.Next; + } + + _expressionNode.Target = new WeakReference(o); + + return _memberValueNode.CurrentValue.Target; } + + private ExpressionNode _expressionNode; + private string _memberName; + private ExpressionNode _memberValueNode; } -} +} \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup/Properties/AssemblyInfo.cs b/src/Markup/Avalonia.Markup/Properties/AssemblyInfo.cs index 4d6ccdf31a..d74ccf00a1 100644 --- a/src/Markup/Avalonia.Markup/Properties/AssemblyInfo.cs +++ b/src/Markup/Avalonia.Markup/Properties/AssemblyInfo.cs @@ -7,4 +7,5 @@ using System.Runtime.CompilerServices; [assembly: AssemblyTitle("Avalonia.Markup")] [assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Markup")] -[assembly: InternalsVisibleTo("Avalonia.Markup.UnitTests")] \ No newline at end of file +[assembly: InternalsVisibleTo("Avalonia.Markup.UnitTests")] +[assembly: InternalsVisibleTo("Avalonia.Markup.Xaml")] \ No newline at end of file