1

在此处输入图像描述

我有上述场景:如果用户单击 ListBox,它将有子项(再次是 ListBox)或详细视图。

所以我目前所做的是:每当用户单击任何项​​目时,如果单击的项目有更多的子项目,则进行网络调用并填写相同的 ListBox。

现在,问题出现在图片中:

  1. 假设我在第 4 个屏幕(详细视图),
  2. 移动到第 3 和第 2 屏幕,数据维护为堆栈(它工作正常,是的,我正在维护数据,ObservableCollection<ObservableCollection<MyObjects>>所以在返回时,我正在从那里获取数据)
  3. 现在,如果我单击屏幕 2 中的任何项目,它将打开屏幕 3 ListBox 数据的详细视图。

意味着 ListBox 没有收到我们已在其中填充数据的通知OnBackKeyPress()

仅供参考,我正在同一页面中填写 ListBox 和 WebBrowser。,所以我的问题是,一旦我从我维护的堆栈中填充了数据,我如何通知 ListBox?

是的,我也实施INotifyPropertyChanged了,但不知道为什么它不起作用。

请检查我的代码:

  1. ListBox 和 WebView 屏幕: http: //pastebin.com/K1G27Yji
  2. RootPageItem 类文件的实现INotifyPropertyChangedhttp ://pastebin.com/E0uqLtVG

抱歉以上述方式粘贴代码,我这样做是因为问题很长。

问题:

如何通知 ListBox 数据已更改OnBackKeyPress

4

3 回答 3

1

如果您设置,会有什么行为:

listBox1.ItemsSource = null;

listBox1.ItemsSource = listRootPageItems;
于 2013-01-07T19:10:44.100 回答
1

这只是错误的架构。请为每个屏幕添加一个页面,而不是重新加载相同的列表框。在 App 类(内部静态)中共享它们之间的数据,并使用内置的导航堆栈来处理“返回”。不要为此目的覆盖 OnBackKeyPress。

您将“免费”获得所需的功能,并且更易于维护和使用代码库。

于 2013-01-07T21:30:48.470 回答
1

糟糕,这是我犯的一个愚蠢的错误。

我忘记在 OnBackKeyPress() 中设置 items[] 数组,但是在单击 item 时正在访问,因此它具有我们向前移动的最后一步的 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;
      }
 }
于 2013-01-08T12:54:52.043 回答