UWP - NavigationViewMenu не рассматривает его MenuItemsSource

Пример: ссылка

Я разрабатываю приложение, которое позволяет людям сохранять заметки и создавать категории, в которых вы можете хранить свои заметки.
Категории перечислены в Списке и ObservableCollection, потому что у меня была проблема, пытаясь сериализовать Список NavigationViewItems.
Итак, я сделал следующий класс:

[DataContract]
class Category
{
    [DataMember]
    public String Title { get; set; }

    [DataMember]
    public int IconIndex { get; set; }

    [DataMember]
    public String Id { get; set; }
}

И в моем App.xaml.cs у меня есть:

internal static ObservableCollection<NavigationViewItem> Categories = new ObservableCollection<NavigationViewItem>();
internal static List<Category> CategoriesItems = new List<Category>();

Категории (ObservableCollection) используются в качестве MenuItemsSource моего NavigationView:

nav.MenuItemsSource = App.Categories;

В другом файле у меня есть функция OpenCategories, которая вызывается при открытии приложения:

public async static void OpenCategories(StorageFile file)
{
    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(await FileIO.ReadTextAsync(file)));
    DataContractJsonSerializer ser = new DataContractJsonSerializer(App.CategoriesItems.GetType());
    App.CategoriesItems = ser.ReadObject(ms) as List<Category>;
    ms.Close();

    UIServices.RefreshCategoriesUI();
}

А вот UIServices.RefreshCategoriesUI ():

public static void RefreshCategoriesUI()
{
    App.Categories = new System.Collections.ObjectModel.ObservableCollection<NavigationViewItem>();
    foreach(Category cat in App.CategoriesItems)
    {
        App.Categories.Add(new NavigationViewItem
        {
            Content = cat.Title,
            Icon = new SymbolIcon((Symbol)Enum.GetValues(typeof(Symbol)).GetValue(cat.IconIndex))
        });
    }
}


=> Моя проблема в том, что, хотя App.Categories содержит NavigationViewItems, мой NavigationViewMenu всегда пуст. Почему не обновляется?

Изменить: вот изменения, которые я сделал.

Категории были перемещены из App.xaml.cs в MainPage.xaml и были преобразованы в DependencyProperty

internal DependencyProperty CategoriesProperty = DependencyProperty.Register("CategoriesProperty", typeof(ObservableCollection<NavigationViewItem>), typeof(App), new PropertyMetadata(default(ObservableCollection<NavigationViewItem>)));

RefreshCategoriesUI больше не используется. Вместо этого я превратил CategoriesItems в свойство ObservableCollection и подписался на событие CollectionChanged:

private void CategoriesItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    var page = (MainPage)((Frame)Window.Current.Content).Content;
    page.Categories = new ObservableCollection<NavigationViewItem>();
    foreach (Category cat in CategoriesItems)
        page.Categories.Add(new NavigationViewItem
        {
            Content = cat.Title,
            Icon = new SymbolIcon((Symbol)Enum.GetValues(typeof(Symbol)).GetValue(cat.IconIndex))
        });
}

И, наконец, OpenCategories теперь работает следующим образом:

public async static void OpenCategories(StorageFile file)
{
    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(await FileIO.ReadTextAsync(file)));
    DataContractJsonSerializer ser = new DataContractJsonSerializer(App.CategoriesItems.GetType());
    ObservableCollection<Category> categories = ser.ReadObject(ms) as ObservableCollection<Category>;
    foreach (Category cat in categories)
        App.CategoriesItems.Add(cat);
    ms.Close();
}

О, и это кажется очевидным, но я изменил MenuItemSource моего NavigationView с App.Categories на Categories по мере перемещения категорий.
Это все еще не работает. И когда я проверяю во время выполнения, Категории содержат все категории, которые я создал с помощью моего приложения.
Более того, это действительно странно, потому что когда я впервые проверил, содержит ли "Категории" что-то (чтобы написать это сообщение), после моей точки останова все категории появились в NavigationView, как это должно происходить каждый раз, но при повторной попытке это не сработало...

1 ответ

Решение

Например, в файле App.xaml.cs. CategoriesItems_CollectionChanged метод, каждый раз, когда есть триггеры событий CollectionChanged, вы создаете новый ObservableCollection<NavigationViewItem> объект затем добавить элементы в него, но вы также должны установить NavigationView.MenuItemsSource к ObservableCollection снова.

Вы можете попробовать изменить свой CategoriesItems_CollectionChanged Метод как следующее.

private void CategoriesItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    // Gets the MainPage
    var page = (MainPage)((Frame)Window.Current.Content).Content;
    page.Categories = new ObservableCollection<NavigationViewItem>();

    // Creates all the NavigationViewItems, based on CategoriesItems
    foreach (Category cat in CategoriesItems)
        page.Categories.Add(new NavigationViewItem
        {
            Content = cat.Title,
            Icon = new SymbolIcon((Symbol)Enum.GetValues(typeof(Symbol)).GetValue(cat.IconIndex))
        });

    //Here is the code to set the NavigationView's MenuItemsSource.

    NavigationView nav= (NavigationView)page.FindName("nav");
    nav.MenuItemsSource = page.Categories;
}
Другие вопросы по тегам