导航助手SaveState / LoadState工作不正确

本文关键字:LoadState 工作 不正确 SaveState 导航 | 更新日期: 2023-09-27 18:18:10

首先,我从数据库中读取条目列表,并将其显示在ListView中。当我离开页面以显示条目的详细信息,然后返回列表时,一切正常。

接下来,我打开另一个页面,向数据库添加一个条目。

返回到列表,从数据库中读取显示正确的计数。

当我去显示一个细节时,正确的计数存储在SaveState中。

返回列表,LoadState给出错误的计数。

显示其他详细信息,现在返回旧列表,不显示添加的条目。

这是我的代码:

    private void getList()
    {
        memoList = new List<MemoItem>();
        db.loadHistory(ref memoList);
        DelButton.IsEnabled = false;
        System.Diagnostics.Debug.WriteLine("GetList, memoList[{0}]", memoList.Count);
    }
    private void NavigationHelper_SaveState(object sender, SaveStateEventArgs e)
    {
        if (memoList != null)
        {
            e.PageState["MemoItem"] = memoList;
            if (memoSelected > -1)
                e.PageState["memoSelected"] = memoSelected;
            System.Diagnostics.Debug.WriteLine("SaveState, memoList[{0}]", memoList.Count);
        }
    }
    private void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
    {
        if (e.PageState != null)
        {
            if (e.PageState.ContainsKey("MemoItem"))
            {
                memoList = (List<MemoItem>)e.PageState["MemoItem"];
                System.Diagnostics.Debug.WriteLine("LoadState, memoList[{0}]", memoList.Count);
                if (e.PageState.ContainsKey("memoSelected"))
                    memoSelected = (int)e.PageState["memoSelected"];
                MemoListView.ItemsSource = memoList;
                MemoListView.Visibility = Visibility.Visible;
            }
            else
            {
                getList();
                showList();
            }
        }
    }
这里是系统。()中带有注释的诊断输出:

GetList, memoList[8](第一次加载)

SaveState, memoList[8](保留列表以显示一个条目的详细信息)

LoadState, memoList[8] (come back to ListView)

SaveState, memoList[8](将列表留到另一页并添加一个条目)

GetList, memoList[9](返回到list,从数据库中读取正确的条目计数)

SaveState, memoList[9](离开ListView以显示一个条目的详细信息)

LoadState, memoList[8](返回到ListView加载错误的旧列表)

SaveState, memoList[8](和工作与旧列表…)

LoadState, memoList[8](…)

注意:我不能每次都从数据库调用GetList,因为我必须保留列表中不包含在数据库中的复选标记。

我的代码有什么问题?我该如何解决这个问题?如何从数据库中获得新列表后使StateEvent数据无效?

导航助手SaveState / LoadState工作不正确

问题解决了。这实际上是反向堆栈操作的结果。

我的程序中有四个基本页面,对它们来说GoBack是有意义的。但我不想陷得更深。(我认为没有人想往回走20步或更多步,但看似无限的BackStack会允许这样做。所需的内存消耗不可忽略。)

为了在选择一个基本页面时清除BackStack,我设置了:

    private void NavButton_Click(object sender, RoutedEventArgs e)
    {
        Button b = sender as Button;
        if (b != null && b.Tag != null)
        {
            Type pageType = Type.GetType(b.Tag.ToString());
            if (pageType != null)
            {
                if (rootFrame.CurrentSourcePageType != pageType)
                {
                    rootFrame.Navigate(pageType, rootFrame); 
                    // No goBack for Basic Pages
                    if (testBasicPage(pageType))
                    {
                        while (rootFrame.BackStackDepth > 1)
                        {
                            rootFrame.BackStack.RemoveAt(0);
                        }
                    }
                }
            }
        }
    }

这个工作很好,直到我遇到SaveState/Load State问题。

现在我首先清空BackStack,然后导航到目标页面。作品。

    private void NavButton_Click(object sender, RoutedEventArgs e)
    {
        Button b = sender as Button;
        if (b != null && b.Tag != null)
        {
            Type pageType = Type.GetType(b.Tag.ToString());
            if (pageType != null)
            {
                if (rootFrame.CurrentSourcePageType != pageType)
                {
                    // No goBack for Basic Pages
                    if (testBasicPage(pageType))
                    {
                        while (rootFrame.BackStackDepth > 0)
                        {
                            rootFrame.BackStack.RemoveAt(0);
                        }
                    }
                    rootFrame.Navigate(pageType, rootFrame); 
                }
            }
        }
    }