2012-07-09 3 views
0

Windows Phone 7 응용 프로그램에서보기를 열면 만들기 위해 특정 업무 순서가 수행됩니다. 지금까지 생성자와 이벤트를 진행하면서,이 순서는 사실을 발견했다 :데이터 바인딩 된 뷰는 어떻게 렌더링됩니까?

  1. Constructor
  2. OnNavigatedTo
  3. OnLoaded
  4. 그러나

가, 내가 데이터 바인딩해야하는 위치에서이다 List ~ ListBox 기본보기 (배경, 기타 요소 등)가로드 된 후 따라서 데이터 바인딩을 사용하기 전에 뷰가로드되는지 알 수있는 시점과 방법을 알아야합니다.

나는이 데이터를 OnLoaded -event에서 처리하려고 시도했지만 여기에 데이터 바인딩을 수행 한 것처럼 보입니다. 그리고 그 요소를 통과 한 직후에 그들은 아직 존재하지 않는 것 같습니다 (VisualTreeHelper -class 노드를 찾는 것 같지 않음). 보시다시피, 나는 붙어 있습니다.

도움을 주시면 감사하겠습니다.

편집 : 요청에 따라, 여기에 더 자세한 정보가 있습니다.

List에는 비동기 적으로로드 된 이미지 (예 : delay.LowProfileImageLoader) 및 직사각형을 비롯하여 일부 맞춤형 (너무 복잡하지 않은) 개체가 채워집니다.

XAML :

<ListBox x:Name="ChannelsListBox" ItemsSource="{Binding AllChannels}"> 
//... 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid x:Name="ChannelTile" Margin="6,6,6,6" Tap="ChannelTile_Tap" Opacity="0.4"> 
      <!-- context menu goes here --> 
      <Rectangle Width="136" Height="136" Fill="{StaticResource LightGrayColor}" /> 
      <Image Width="136" Height="136" delay:LowProfileImageLoader.UriSource="{Binding ImageUri}" /> 
     </Grid> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
</ListBox> 

코드 숨김 자체 메모리 (응용 프로그램의 초기 단계에서 REST에서 가져온), 그래서 가능해야한다

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

    UpdateApplicationBar(); 

    pickChannelsViewModel = new PickChannelsViewModel(); 
    DataContext = pickChannelsViewModel; 

    if (hasUpdatedTiles) 
    { 
     pickChannelsViewModel.IsLoading = false; // Set by UpdateTiles() 
    } 
} 


private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) 
{ 
    // This is where I would data bind the list (instead of in XAML) 
    UpdateTiles(); // Traverses the list and changes opacity of "selected" items. 
} 

protected void UpdateTiles() 
    { 
     foreach (var item in ChannelsListBox.Items) 
     { 
      if (pickChannelsViewModel.SelectedChannels.Contains(item as Channel)) 
      { 
       var index = ChannelsListBox.Items.IndexOf(item); 

       // This returns null when databinding in codebehind, 
       // but not in XAML 
       ListBoxItem currentItem = ChannelsListBox.ItemContainerGenerator.ContainerFromIndex(index) as ListBoxItem; 

       if (currentItem != null && VisualTreeHelper.GetChildrenCount(currentItem) == 1) 
       { 
        var OuterWrapper = VisualTreeHelper.GetChild(currentItem, 0); 
        var MiddleWrapper = VisualTreeHelper.GetChild(OuterWrapper, 0); 
        var InnerWrapper = VisualTreeHelper.GetChild(MiddleWrapper, 0); 
        Grid currentItemGrid = VisualTreeHelper.GetChild(InnerWrapper, 0) as Grid; 

        currentItemGrid.Opacity = 1.0; 
       } 
      } 
     } 
     pickChannelsViewModel.IsLoading = false; 
     hasUpdatedTiles = true; 
    } 

항목 즉시.

해결해야 할 문제는 특히이보기에서 매우 긴 로딩 시간입니다 (이러한 항목 중 약 140 개가 만들어지고 다음으로 필터링되어 불투명도가 변경됨). 당신이 목록의 변화는 항상 목록 상자에 반영되어야 할 목록 상자의 ItemSource를 설정하면

myListBox.ItemSource=myList; 

:

답변

0

난 당신이 같은 일을하고있다 생각합니다. ListBox가 비어있는 경우 List가 제대로 채워지지 않거나 ItemTemplate에 Bindings이 유효하지 않은 것이 원인입니다. 디버그하여 Loaded() 메서드에 중단 점을 삽입하여 목록에 항목이 있는지 확인해야합니다. 또한 목록에 포함 된 항목이나 애플리케이션에서 채워지는 항목을 언급하지 않았습니다. 불완전한 정보는 누구에게 도움이되지 않습니다.

+0

더 많은 정보가 추가되었습니다. 처음부터 포함시키지 않으 셨으니 죄송합니다. –

관련 문제