2011-10-05 4 views
1

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

Причина, по которой я должен обнаружить это событие, заключается в том, что я хочу показать ApplicationBar только после того, как элементы управления 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; } 
} 

in my C# code-behind, я связываю данные следующим образом.

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 

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

всякая помощь приветствуется.

ответ

4

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

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

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

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

+0

спасибо. что действительно помогло облегчить симптом. –

+0

Только для записи это означает * любые * изменения в пользовательском интерфейсе. Регулярные изменения непосредственно в потоке пользовательского интерфейса принудительно завершаются, где при запуске BeginInvoke. –