diff --git a/src/Wpf.Ui/Controls/NavigationView/NavigationView.Properties.cs b/src/Wpf.Ui/Controls/NavigationView/NavigationView.Properties.cs index 2f714bcfa..746899a80 100644 --- a/src/Wpf.Ui/Controls/NavigationView/NavigationView.Properties.cs +++ b/src/Wpf.Ui/Controls/NavigationView/NavigationView.Properties.cs @@ -450,6 +450,49 @@ public Thickness FrameMargin set => SetValue(FrameMarginProperty, value); } + private void OnMenuItemsSource_CollectionChanged(object? sender, IList collection, NotifyCollectionChangedEventArgs e) + { + if (ReferenceEquals(sender, collection)) + { + return; + } + + switch (e.Action) + { + case NotifyCollectionChangedAction.Add: + foreach (var item in e.NewItems) + { + collection.Add(item); + } + break; + + case NotifyCollectionChangedAction.Remove: + foreach (var item in e.OldItems) + { + if (!e.NewItems.Contains(item)) + { + collection.Remove(item); + } + } + break; + + case NotifyCollectionChangedAction.Move: + var moveItem = MenuItems[e.OldStartingIndex]; + collection.RemoveAt(e.OldStartingIndex); + collection.Insert(e.NewStartingIndex, moveItem); + break; + + case NotifyCollectionChangedAction.Replace: + collection.RemoveAt(e.OldStartingIndex); + collection.Insert(e.OldStartingIndex, e.NewItems[0]); + break; + + case NotifyCollectionChangedAction.Reset: + collection.Clear(); + break; + } + } + private void OnMenuItems_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) { if (e.NewItems is null) @@ -481,6 +524,11 @@ private static void OnMenuItemsSourceChanged(DependencyObject? d, DependencyProp { navigationView.MenuItems.Add(e.NewValue); } + + if (e.NewValue is INotifyCollectionChanged oc) + { + oc.CollectionChanged += (s, e) => navigationView.OnMenuItemsSource_CollectionChanged(oc, navigationView.MenuItems, e); + } } private void OnFooterMenuItems_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) @@ -517,6 +565,11 @@ DependencyPropertyChangedEventArgs e { navigationView.FooterMenuItems.Add(e.NewValue); } + + if (e.NewValue is INotifyCollectionChanged oc) + { + oc.CollectionChanged += (s, e) => navigationView.OnMenuItemsSource_CollectionChanged(oc, navigationView.FooterMenuItems, e); + } } private static void OnPaneDisplayModeChanged(DependencyObject? d, DependencyPropertyChangedEventArgs e)