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