diff --git a/src/Avalonia.Controls/Flyouts/MenuFlyout.cs b/src/Avalonia.Controls/Flyouts/MenuFlyout.cs index 8e1bc214a7..a2ce93ee6d 100644 --- a/src/Avalonia.Controls/Flyouts/MenuFlyout.cs +++ b/src/Avalonia.Controls/Flyouts/MenuFlyout.cs @@ -1,6 +1,5 @@ using System.Collections; using System.ComponentModel; -using Avalonia.Collections; using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; using Avalonia.Metadata; @@ -12,17 +11,15 @@ namespace Avalonia.Controls { public MenuFlyout() { - _items = new AvaloniaList(); + Items = new ItemCollection(); } /// - /// Defines the property + /// Defines the property /// - public static readonly DirectProperty ItemsProperty = - AvaloniaProperty.RegisterDirect( - nameof(Items), - x => x.Items, - (x, v) => x.Items = v); + public static readonly StyledProperty ItemsSourceProperty = + AvaloniaProperty.Register( + nameof(ItemsSource)); /// /// Defines the property @@ -45,14 +42,16 @@ namespace Avalonia.Controls public Classes FlyoutPresenterClasses => _classes ??= new Classes(); + [Content] + public ItemCollection Items { get; } + /// /// Gets or sets the items of the MenuFlyout /// - [Content] - public IEnumerable? Items + public IEnumerable? ItemsSource { - get => _items; - set => SetAndRaise(ItemsProperty, ref _items, value); + get => GetValue(ItemsSourceProperty); + set => SetValue(ItemsSourceProperty, value); } /// @@ -83,14 +82,13 @@ namespace Avalonia.Controls } private Classes? _classes; - private IEnumerable? _items; private IDataTemplate? _itemTemplate; protected override Control CreatePresenter() { return new MenuFlyoutPresenter { - [!ItemsControl.ItemsSourceProperty] = this[!ItemsProperty], + ItemsSource = Items, [!ItemsControl.ItemTemplateProperty] = this[!ItemTemplateProperty], [!ItemsControl.ItemContainerThemeProperty] = this[!ItemContainerThemeProperty], }; @@ -113,5 +111,13 @@ namespace Avalonia.Controls base.OnOpening(args); } + + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) + { + base.OnPropertyChanged(change); + + if (change.Property == ItemsSourceProperty) + Items.SetItemsSource(change.GetNewValue()); + } } } diff --git a/src/Avalonia.Controls/ItemsSourceView.cs b/src/Avalonia.Controls/ItemsSourceView.cs index 614b70d0ba..977d712371 100644 --- a/src/Avalonia.Controls/ItemsSourceView.cs +++ b/src/Avalonia.Controls/ItemsSourceView.cs @@ -262,7 +262,7 @@ namespace Avalonia.Controls _source = source switch { - ItemsSourceView => throw new ArgumentException("Cannot wrap an existing ItemsSourceView.", nameof(source)), + ItemsSourceView isv => isv.Source, IList list => list, INotifyCollectionChanged => throw new ArgumentException( "Collection implements INotifyCollectionChanged but not IList.", diff --git a/tests/Avalonia.Controls.UnitTests/MaskedTextBoxTests.cs b/tests/Avalonia.Controls.UnitTests/MaskedTextBoxTests.cs index 19009416ef..9464df230d 100644 --- a/tests/Avalonia.Controls.UnitTests/MaskedTextBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/MaskedTextBoxTests.cs @@ -72,7 +72,7 @@ namespace Avalonia.Controls.UnitTests Text = "1234", ContextFlyout = new MenuFlyout { - Items = new List + Items = { new MenuItem { Header = "Item 1" }, new MenuItem {Header = "Item 2" }, diff --git a/tests/Avalonia.Controls.UnitTests/MenuItemTests.cs b/tests/Avalonia.Controls.UnitTests/MenuItemTests.cs index 1049ff2678..7b959ccc5e 100644 --- a/tests/Avalonia.Controls.UnitTests/MenuItemTests.cs +++ b/tests/Avalonia.Controls.UnitTests/MenuItemTests.cs @@ -230,7 +230,7 @@ namespace Avalonia.Controls.UnitTests return true; }); var target = new MenuItem(); - var flyout = new MenuFlyout { Items = new AvaloniaList { target } }; + var flyout = new MenuFlyout { Items = { target } }; var button = new Button { Flyout = flyout }; var window = new Window { Content = button }; window.ApplyStyling(); diff --git a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs index 0f0fd8f6c4..d71abe5a67 100644 --- a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs @@ -93,7 +93,7 @@ namespace Avalonia.Controls.UnitTests Text = "1234", ContextFlyout = new MenuFlyout { - Items = new List + Items = { new MenuItem { Header = "Item 1" }, new MenuItem {Header = "Item 2" },