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;
}