Browse Source
Merge pull request #11008 from AvaloniaUI/fixes/10946-dont-allow-items-binding
Make binding to `ItemsControl.Items` a compile error.
pull/11010/head
Max Katz
3 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with
49 additions and
11 deletions
-
src/Avalonia.Controls/Flyouts/Flyout.cs
-
src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlDeferredResourceTransformer.cs
-
src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlDesignPropertiesTransformer.cs
-
src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/XDataTypeTransformer.cs
-
src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/XNameTransformer.cs
-
src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github
-
src/tools/Avalonia.Generators/Compiler/NameDirectiveTransformer.cs
-
tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs
|
|
|
@ -13,12 +13,22 @@ namespace Avalonia.Controls |
|
|
|
public static readonly StyledProperty<object> ContentProperty = |
|
|
|
AvaloniaProperty.Register<Flyout, object>(nameof(Content)); |
|
|
|
|
|
|
|
private Classes? _classes; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Gets the Classes collection to apply to the FlyoutPresenter this Flyout is hosting
|
|
|
|
/// </summary>
|
|
|
|
public Classes FlyoutPresenterClasses => _classes ??= new Classes(); |
|
|
|
|
|
|
|
private Classes? _classes; |
|
|
|
public Classes FlyoutPresenterClasses |
|
|
|
{ |
|
|
|
get => _classes ??= new Classes(); |
|
|
|
set |
|
|
|
{ |
|
|
|
if (_classes is null) |
|
|
|
_classes = value; |
|
|
|
else if (_classes != value) |
|
|
|
_classes.Replace(value); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Defines the <see cref="FlyoutPresenterTheme"/> property.
|
|
|
|
|
|
|
|
@ -65,7 +65,8 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers |
|
|
|
{ |
|
|
|
AllowMultiple = true, |
|
|
|
AllowXNull = allowNull, |
|
|
|
AllowRuntimeNull = allowNull |
|
|
|
AllowRuntimeNull = allowNull, |
|
|
|
AllowAttributeSyntax = false, |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -37,7 +37,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers |
|
|
|
on.Children[c] = new XamlAstXamlPropertyValueNode(ch, |
|
|
|
new XamlAstNamePropertyReference(ch, |
|
|
|
new XamlAstXmlTypeReference(ch, AvaloniaNs, "Design"), |
|
|
|
mapTo, on.Type), directive.Values); |
|
|
|
mapTo, on.Type), directive.Values, true); |
|
|
|
c++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -52,7 +52,8 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers |
|
|
|
new XamlAstNamePropertyReference(d, |
|
|
|
new XamlAstClrTypeReference(ch, declaringType, false), dataTypeProperty.Name, |
|
|
|
on.Type), |
|
|
|
d.Values); |
|
|
|
d.Values, |
|
|
|
true); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -24,7 +24,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers |
|
|
|
|
|
|
|
on.Children[c] = new XamlAstXamlPropertyValueNode(d, |
|
|
|
new XamlAstNamePropertyReference(d, on.Type, "Name", on.Type), |
|
|
|
d.Values); |
|
|
|
d.Values, true); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -1 +1 @@ |
|
|
|
Subproject commit 5e498f8bcca403a34aff5efc825cbb4e12b7fa8e |
|
|
|
Subproject commit 5dd0b042e144e677638224c49fec16dab66143e8 |
|
|
|
@ -20,9 +20,9 @@ internal class NameDirectiveTransformer : IXamlAstTransformer |
|
|
|
objectNode.Children[index] = new XamlAstXamlPropertyValueNode( |
|
|
|
directive, |
|
|
|
new XamlAstNamePropertyReference(directive, objectNode.Type, "Name", objectNode.Type), |
|
|
|
directive.Values); |
|
|
|
directive.Values, true); |
|
|
|
} |
|
|
|
|
|
|
|
return node; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -910,7 +910,33 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml |
|
|
|
Assert.Equal("World", target.Test2); |
|
|
|
Assert.Equal("Hello", target.Test1); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Can_Specify_Button_Classes() |
|
|
|
{ |
|
|
|
var xaml = "<Button xmlns='https://github.com/avaloniaui' Classes='foo bar'/>"; |
|
|
|
var target = (Button)AvaloniaRuntimeXamlLoader.Load(xaml); |
|
|
|
|
|
|
|
Assert.Equal(new[] { "foo", "bar" }, target.Classes); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Can_Specify_Flyout_FlyoutPresenterClasses() |
|
|
|
{ |
|
|
|
var xaml = "<Flyout xmlns='https://github.com/avaloniaui' FlyoutPresenterClasses='foo bar'/>"; |
|
|
|
var target = (Flyout)AvaloniaRuntimeXamlLoader.Load(xaml); |
|
|
|
|
|
|
|
Assert.Equal(new[] { "foo", "bar" }, target.FlyoutPresenterClasses); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Trying_To_Bind_ItemsControl_Items_Throws() |
|
|
|
{ |
|
|
|
var xaml = "<ItemsControl xmlns='https://github.com/avaloniaui' Items='{Binding}'/>"; |
|
|
|
|
|
|
|
Assert.ThrowsAny<XmlException>(() => AvaloniaRuntimeXamlLoader.Load(xaml)); |
|
|
|
} |
|
|
|
|
|
|
|
private class SelectedItemsViewModel : INotifyPropertyChanged |
|
|
|
{ |
|
|
|
public string[] Items { get; set; } |
|
|
|
|