我什么时候应该设置ListBox的ItemsSource属性?

时间:2012-01-03 05:45:53

标签: silverlight windows-phone-7.1 windows-phone-7

我正在编写一个WP7应用程序,它在其页面的OnNavigatedTo()覆盖处理程序中的主UI线程上恢复其状态。在此处理程序中,它将页面的listbox ItemsSource属性设置为反序列化的ObservableCollection数据项。反序列化来自隔离存储,速度很快,不会挂起线程。

但是,当页面出现时,列表框为空。在设置断点并检查页面状态时,Items属性已正确填充且非空。

如果我像这样延迟ItemsSource属性的设置:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
  base.OnNavigatedTo(e);

  int delayMs = 100; // Why 100 ?
  runDelayedDispatch(Deployment.Current.Dispatcher, 
   delayMs, delegate() 
  {
    deserializeFromStorageAndSetItemsSource();
  });
}

...

// Does a BeginInvoke() after the specified delay.
public static void runDelayedDispatch(Dispatcher dispatcher,
  int delayInMilliseconds, Action action)
{
  Action dispatcherAction = delegate()
  {
    dispatcher.BeginInvoke(action);
  };

  BackgroundWorker worker = new BackgroundWorker();
  worker.DoWork += (s, e) => Thread.Sleep(delayInMilliseconds);
  worker.RunWorkerCompleted += (s, e) => dispatcherAction.Invoke();
  worker.RunWorkerAsync();
}

然后一切正常。

我做错了什么?我应该从不同处理程序的隔离存储中读取还是稍后在应用程序生命周期中读取?

关于应用程序生命周期的文章没有说明这一点:(

http://msdn.microsoft.com/en-us/library/system.windows.controls.page.onnavigatedto(v=vs.95).aspx http://msdn.microsoft.com/en-us/library/cc838245(v=vs.95).aspx http://windowsphonegeek.com/articles/WP7-Application-Lifecycle-and-Tombstoning http://visualstudiomagazine.com/articles/2011/06/01/pcmob_app-lifecycle.aspx

谢谢!

3 个答案:

答案 0 :(得分:1)

听起来好像您的数据上下文设置不正确,绑定设置不正确,或者您的INotifyPropertyChanged未触发。

PS:我认为你应该改写你的问题,以摆脱你的延迟绕过问题的尝试 - 这是你不想要的线路给你的答案,我很确定它不需要在所有。相反,在您的问题中为列表和页面添加所有 RELEVANT 代码,以便我们可以看到您正在做的事情。

答案 1 :(得分:0)

您所要做的就是使用INotifyPropertyChanged

刷新用户界面
protected override void OnNavigatedTo(NavigationEventArgs e)
{
  base.OnNavigatedTo(e);

  int delayMs = 100; // Why 100 ?
  runDelayedDispatch(Deployment.Current.Dispatcher, 
   delayMs, delegate() 
  {
    deserializeFromStorageAndSetItemsSource();
  });

  NotifyPropertyChange("UI");
}

public static void runDelayedDispatch(Dispatcher dispatcher,
  int delayInMilliseconds, Action action)
{
  Action dispatcherAction = delegate()
  {
    dispatcher.BeginInvoke(action);
  };

  BackgroundWorker worker = new BackgroundWorker();
  worker.DoWork += (s, e) => Thread.Sleep(delayInMilliseconds);
  worker.RunWorkerCompleted += (s, e) => dispatcherAction.Invoke();
  worker.RunWorkerAsync();

  NotifyPropertyChanged("UI");
}

public event PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(String info)
{
  if (PropertyChanged != null)
  {
    PropertyChanged(this, new PropertyChangedEventArgs(info));
  }
}

答案 2 :(得分:0)

我找到了,谢谢大家!我回到基础并从一个裸骨列表框测试了这个场景,它在OnNavigatedTo()中工作没有任何问题。

罪魁祸首是,当DataContext发生变化以便将列表框项目的宽度绑定到列表框宽度时,我正在接收通知,但我可以通过挂钩到LayoutUpdated事件轻松完成此任务。

这是我删除的罪魁祸首代码: http://www.codeproject.com/Articles/38559/Silverlight-DataContext-Changed-Event

谢谢你们,抱歉浪费你的时间:|