Browse Source

Design properties not being applied for user controls (#20986)

* Split source and target controls in Should_Apply_Design_Mode_Properties_From_Control_To_Window test

* Fix invalid binding being applied

* Use indexer bindings, avoid bind to observable
pull/20994/head
Max Katz 6 months ago
committed by GitHub
parent
commit
953e5800ce
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 6
      src/Avalonia.Controls/Design.cs
  2. 15
      tests/Avalonia.Controls.UnitTests/DesignTests.cs

6
src/Avalonia.Controls/Design.cs

@ -303,11 +303,11 @@ namespace Avalonia.Controls
public static void ApplyDesignModeProperties(Control target, Control source)
{
if (source.IsSet(WidthProperty))
target.Bind(Layoutable.WidthProperty, target.GetBindingObservable(WidthProperty));
target.Bind(Layoutable.WidthProperty, source[!WidthProperty]);
if (source.IsSet(HeightProperty))
target.Bind(Layoutable.HeightProperty, target.GetBindingObservable(HeightProperty));
target.Bind(Layoutable.HeightProperty, source[!HeightProperty]);
if (source.IsSet(DataContextProperty))
target.Bind(StyledElement.DataContextProperty, target.GetBindingObservable(DataContextProperty));
target.Bind(StyledElement.DataContextProperty, source[!DataContextProperty]);
if (source.IsSet(DesignStyleProperty))
target.Styles.Add(GetDesignStyle(source));
}

15
tests/Avalonia.Controls.UnitTests/DesignTests.cs

@ -79,11 +79,14 @@ public class DesignTests : ScopedTestBase
}
[Fact]
public void Should_Apply_Design_Mode_Properties()
public void Should_Apply_Design_Mode_Properties_From_Control_To_Window()
{
using var _ = UnitTestApplication.Start(TestServices.StyledWindow);
// Use-case: User previews a control, which is wrapped by the window.
var window = new Window();
var control = new ContentControl();
window.Content = control;
Design.SetWidth(control, 200);
Design.SetHeight(control, 150);
@ -94,12 +97,12 @@ public class DesignTests : ScopedTestBase
Setters = { new Setter(TemplatedControl.BackgroundProperty, Brushes.Yellow) }
});
Design.ApplyDesignModeProperties(control, control);
Design.ApplyDesignModeProperties(window, control);
Assert.Equal(200, control.Width);
Assert.Equal(150, control.Height);
Assert.Equal("TestDataContext", control.DataContext);
Assert.Contains(control.Styles,
Assert.Equal(200, window.Width);
Assert.Equal(150, window.Height);
Assert.Equal("TestDataContext", window.DataContext);
Assert.Contains(window.Styles,
s => ((Style)s).Setters.OfType<Setter>().First().Property == TemplatedControl.BackgroundProperty);
}

Loading…
Cancel
Save