サンプル: リンク
人々がメモを保存し、メモを保存できるカテゴリを作成できるアプリケーションを開発しています。
NavigationViewItems の List をシリアル化しようとして問題が発生したため、カテゴリは List と ObservableCollection にリストされています。そこで、次のクラスを作成しました。
[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) は、NavigationView の MenuItemsSource として使用されます。
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();
}
ああ、それは明らかですが、カテゴリが移動したため、NavigationView の MenuItemSource を App.Categories からカテゴリに変更しました。
まだ機能していません。実行時に確認すると、アプリで作成したすべてのカテゴリが Categories に含まれています。
さらに、Categories に何かが含まれているかどうかを最初に確認したとき (この記事を書くため)、ブレークポイントの後、すべてのカテゴリが NavigationView にポップアップ表示され、毎回行うはずだったのですが、もう一度試してみるとうまくいきませんでした。 .