导航助手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数据无效?
问题解决了。这实际上是反向堆栈操作的结果。
我的程序中有四个基本页面,对它们来说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);
}
}
}
}