Skip to content

Commit cc638ac

Browse files
committed
Allow [AssignBinding] on attached property getters
1 parent 410b46e commit cc638ac

File tree

4 files changed

+66
-5
lines changed

4 files changed

+66
-5
lines changed

src/Avalonia.Base/Data/AssignBindingAttribute.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace Avalonia.Data
1010
/// Applying this attribute to a property indicates that the binding should be assigned to
1111
/// the property rather than bound.
1212
/// </remarks>
13-
[AttributeUsage(AttributeTargets.Property)]
13+
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Method)]
1414
public sealed class AssignBindingAttribute : Attribute
1515
{
1616
}

src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,12 +204,11 @@ class XamlIlAvaloniaProperty : XamlAstClrProperty, IXamlIlAvaloniaProperty
204204
public IXamlField AvaloniaProperty { get; }
205205
public XamlIlAvaloniaProperty(XamlAstClrProperty original, IXamlField field,
206206
AvaloniaXamlIlWellKnownTypes types)
207-
:base(original, original.Name, original.DeclaringType, original.Getter, original.Setters)
207+
:base(original, original.Name, original.DeclaringType, original.Getter, original.Setters, original.CustomAttributes)
208208
{
209209
var assignBinding = original.CustomAttributes.Any(ca => ca.Type.Equals(types.AssignBindingAttribute));
210210

211211
AvaloniaProperty = field;
212-
CustomAttributes = original.CustomAttributes;
213212
if (!assignBinding)
214213
Setters.Insert(0, new BindingSetter(types, original.DeclaringType, field));
215214

@@ -459,7 +458,7 @@ sealed class XamlIlAvaloniaClassProperty : XamlAstClrProperty,
459458

460459
public XamlIlAvaloniaClassProperty(AvaloniaXamlIlWellKnownTypes types,
461460
string className,
462-
IXamlLineInfo lineInfo) : base(lineInfo, className, types.Classes, null, null, null)
461+
IXamlLineInfo lineInfo) : base(lineInfo, className, types.Classes, null)
463462
{
464463
Parameters = [types.XamlIlTypes.String];
465464
_method = types.GetClassProperty;
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#nullable enable
2+
3+
using Avalonia.Controls;
4+
using Avalonia.Data;
5+
using Avalonia.UnitTests;
6+
using Xunit;
7+
8+
namespace Avalonia.Markup.Xaml.UnitTests.Xaml;
9+
10+
public class AssignBindingTests : XamlTestBase
11+
{
12+
[Fact]
13+
public void AssignBinding_Works_With_Clr_Property()
14+
{
15+
using var app = UnitTestApplication.Start(TestServices.StyledWindow);
16+
17+
var control = (AssignBindingTestControl)AvaloniaRuntimeXamlLoader.Load(
18+
"""
19+
<local:AssignBindingTestControl
20+
xmlns='https://github.com/avaloniaui'
21+
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
22+
xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'
23+
ClrBinding='{Binding SomePath}' />
24+
""");
25+
26+
Assert.NotNull(control.ClrBinding);
27+
}
28+
29+
[Fact]
30+
public void AssignBinding_Works_With_AttachedProperty()
31+
{
32+
using var app = UnitTestApplication.Start(TestServices.StyledWindow);
33+
34+
var control = (Control)AvaloniaRuntimeXamlLoader.Load(
35+
"""
36+
<Control
37+
xmlns='https://github.com/avaloniaui'
38+
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
39+
xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'
40+
local:AssignBindingTestControl.AttachedBinding='{Binding SomePath}' />
41+
""");
42+
43+
var binding = AssignBindingTestControl.GetAttachedBinding(control);
44+
Assert.NotNull(binding);
45+
}
46+
}
47+
48+
public sealed class AssignBindingTestControl : Control
49+
{
50+
[AssignBinding]
51+
public IBinding? ClrBinding { get; set; }
52+
53+
public static readonly AttachedProperty<IBinding?> AttachedBindingProperty =
54+
AvaloniaProperty.RegisterAttached<AssignBindingTestControl, Control, IBinding?>("AttachedBinding");
55+
56+
[AssignBinding]
57+
public static IBinding? GetAttachedBinding(Control obj)
58+
=> obj.GetValue(AttachedBindingProperty);
59+
60+
public static void SetAttachedBinding(Control obj, IBinding? value)
61+
=> obj.SetValue(AttachedBindingProperty, value);
62+
}

0 commit comments

Comments
 (0)