0

サンプル: リンク

人々がメモを保存し、メモを保存できるカテゴリを作成できるアプリケーションを開発しています。

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は使用されなくなりました。代わりに、CategoriesItemsObservableCollectionプロパティに変換し、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 にポップアップ表示され、毎回行うはずだったのですが、もう一度試してみるとうまくいきませんでした。 .

4

1 に答える 1