Windows Phone 7 응용 프로그램에서보기를 열면 만들기 위해 특정 업무 순서가 수행됩니다. 지금까지 생성자와 이벤트를 진행하면서,이 순서는 사실을 발견했다 :데이터 바인딩 된 뷰는 어떻게 렌더링됩니까?
Constructor
OnNavigatedTo
OnLoaded
그러나
가, 내가 데이터 바인딩해야하는 위치에서이다 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;
:
더 많은 정보가 추가되었습니다. 처음부터 포함시키지 않으 셨으니 죄송합니다. –