2 changed files with 36 additions and 8 deletions
@ -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.
|
// 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.Controls.Templates; |
||||
|
using Avalonia.Markup.Data; |
||||
|
using System; |
||||
|
|
||||
namespace Avalonia.Markup.Xaml.Templates |
namespace Avalonia.Markup.Xaml.Templates |
||||
{ |
{ |
||||
public class MemberSelector : IMemberSelector |
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) |
public object Select(object o) |
||||
{ |
{ |
||||
// TODO: Handle nested property paths, changing values etc.
|
if (_expressionNode == null) |
||||
var property = o.GetType().GetRuntimeProperty(MemberName); |
{ |
||||
return property?.GetValue(o); |
_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; |
||||
} |
} |
||||
} |
} |
||||
Loading…
Reference in new issue