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

时间:2014-08-15 04:16:35

标签: c# windows-phone-8.1

首先,我从数据库中读取条目列表并将其显示在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();
            }
        }
    }

以下是带有注释的Systems.Diagnostic输出:():

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

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

LoadState,memoList [8](回到ListView)

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

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

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

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

SaveState,memoList [8](并使用旧列表...)

LoadState,memoList [8](...)

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

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

1 个答案:

答案 0 :(得分:0)

问题现在解决了。这实际上是后堆栈操作的结果。

我的程序中有四个基本页面,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); 
                }
            }
        }
    }