Когда я должен установить свойство ItemsSource объекта ListBox? - PullRequest
0 голосов
/ 03 января 2012

Я пишу приложение WP7, которое восстанавливает свое состояние в главном потоке пользовательского интерфейса в обработчике переопределения OnNavigatedTo () на своей странице. В этом обработчике он устанавливает для свойства ListSource списка страниц десериализованную коллекцию 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 ]

1 голос
/ 03 января 2012

Похоже, что ваш контекст данных установлен неправильно, ваша привязка установлена ​​неправильно, или ваш INotifyPropertyChanged не запускается.

PS: Я думаю, что вам следует перефразировать ваш вопрос, чтобы избавиться от попытки обойти проблему с задержкой - то есть дать вам ответы в том духе, который вам не нужен, и я уверен, что в все. Вместо этого добавьте ALL RELEVANT код для списка и страницы в вашем вопросе, чтобы мы могли видеть, что вы делаете.

0 голосов
/ 04 января 2012

Я нашел это, спасибо всем!Я вернулся к основам и протестировал этот сценарий из списка пустых списков, и он без проблем работал в OnNavigatedTo ().

Преступник заключался в том, что я пытался получить уведомление, когда DataContext изменилсяЧтобы привязать ширину элементов списка к ширине списка, я мог бы легко это сделать, подключившись к событию LayoutUpdated.

Вот код, который я удалил: http://www.codeproject.com/Articles/38559/Silverlight-DataContext-Changed-Event

Спасибо, ребята, и извините, что потратили ваше время: |

0 голосов
/ 03 января 2012

Все, что вам нужно сделать, это обновить пользовательский интерфейс, используя 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));
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...