как определить, когда привязка данных к элементам пользовательского интерфейса (panorama и listbox) завершена в Windows phone 7?

#windows-phone-7 #panorama-control #listbox-control

#windows-phone-7 #панорама-управление #listbox-управление

Вопрос:

у меня есть элемент управления Panorama и элементы управления ListBox внутри панорамы. есть ли какое-либо «событие», к которому я могу подключиться, или какой-либо способ определить, когда все привязки данных или отображение пользовательского интерфейса, связанные с элементами управления Panorama и / или ListBox, завершены?

причина, по которой мне нужно обнаружить это событие, заключается в том, что я хочу показывать панель приложений только после того, как элементы управления Panorama и / или ListBox полностью привязаны и завершили рендеринг.

например, мой XAML определяется следующим образом.

 <controls:Panorama Name="panorama">
 <controls:Panorama.ItemTemplate>
  <DataTemplate>
   <ListBox ItemsSource="{Binding Details}">
    <ListBox.ItemTemplate>
     <DataTemplate>
      <TextBlock Text="{Binding Field1}"/>
      <TextBlock Text="{Binding Field2}"/>
      ...
      <TextBlock Text="{Binding FieldN}"/>
     </DataTemplate>
    </ListBox.ItemTemplate>
   </ListBox>
  </DataTemplate>
 </controls:Panorama.ItemTemplate>
</controls:Panorama>
  

мой обычный объект CLR (POCO) выглядит следующим образом.

 public class MyPoco {
 List<Detail> Details { get; set; }
}
public class Detail {
 public string Field1 { get; set; }
 public string Field1 { get; set; }
 ...
 public string FieldN { get; set; }
}
  

в моем коде c # я привязываю данные следующим образом.

 List<MyPoco> pocos = GetMyPocosFromSomewhere();   
panorama.ItemsSource = myList;
ApplicationBar.IsVisible = true; //i only want to make this visible after the Panorama and ListBox controls have finished binding and rendering
  

прямо сейчас код, который я набросал выше, работает, но панель приложений всегда видна до отображения элементов управления Panorama / ListBox. для меня это затрудняет работу пользователя.

любая помощь приветствуется.

Ответ №1:

Короткий ответ будет «нет, вы не можете его обнаружить».

Но хорошим решением является добавление команды в рабочую очередь пользовательского интерфейса, иначе. Диспетчер. Вот так:

 Dispatcher.BeginInvoke(() => ApplicationBar.IsVisible = true);
  

Таким образом, сначала он отобразит его, когда будут выполнены все остальные задачи пользовательского интерфейса, и опыт не должен быть таким неудобным.

Комментарии:

1. Просто для записи, это касается любых изменений в пользовательском интерфейсе. Принудительно выполняются регулярные изменения непосредственно в потоке пользовательского интерфейса, где в качестве BeginInvoke ставится в очередь.