我有上面的场景:如果用户点击ListBox,它将有子项(再次列表框)或详细视图。
所以我目前所做的是:每当用户点击任何项目时,进行网络通话并填充相同的ListBox,如果点击的项目还有其他子项目。
现在,问题出现在图片中:
ObservableCollection<ObservableCollection<MyObjects>>
中的数据,所以在回移时,我从那里获取数据)意味着ListBox未收到我们在OnBackKeyPress()
仅供参考,我在同一页面填写了ListBox和WebBrowser。,所以我的问题是,一旦我从堆栈中填充数据,我如何通知ListBox?
是的,我已经实施了 INotifyPropertyChanged
,但不知道为什么它无效。
请检查我的代码:
INotifyPropertyChanged
:http://pastebin.com/E0uqLtVG 如何通知ListBox数据已从OnBackKeyPress
更改?
答案 0 :(得分:1)
如果你设置了什么行为:
listBox1.ItemsSource = null;
前
listBox1.ItemsSource = listRootPageItems;
答案 1 :(得分:1)
这是错误的架构。请为每个屏幕添加一个页面,而不是重新加载相同的列表框。在App类(内部静态)中共享它们之间的数据,并使用内置的导航堆栈来处理“返回”。不要为此目的覆盖OnBackKeyPress。
您将获得所需的“免费”功能,更易于维护和使用代码库。
答案 2 :(得分:1)
哎呀,这是一个愚蠢的错误。
我忘了在OnBackKeyPress()中设置items []数组但是在点击项目时访问,因此它有最后一步的items []数据我们向前移动,它正在执行相同的数据。
现在,我刚刚包含了一行,它解决了我的问题。
items = listRootPageItems.ToArray(); // resolution point
所以onBackKeyPress()的最终代码是:
/**
* While moving back, taking data from stack and displayed inside the same ListBox
* */
protected override void OnBackKeyPress(CancelEventArgs e)
{
listBox1.Visibility = Visibility.Visible;
webBrowser1.Visibility = Visibility.Collapsed;
listBox1.SelectedIndex = -1;
if (dataStack.Count != 0)
{
listBox1.ItemsSource = null;
listRootPageItems = dataStack[dataStack.Count-1];
listBox1.ItemsSource = listRootPageItems;
items = listRootPageItems.ToArray(); // resolution point
dataStack.Remove(listRootPageItems);
e.Cancel = true;
}
}