Windows Phone 7 アプリケーションがビューを開くと、特定の順序に従って作成されます。コンストラクターとイベントに関する限り、次の順序が正しいことがわかりました。
Constructor
OnNavigatedTo
OnLoaded
ただし、基本的なビュー (背景、その他の要素など) が読み込まれた後、 aList
を aにデータバインドする必要がある立場にあります。ListBox
したがって、データ バインディングを開始する前に、いつ、どのようにしてビューが読み込まれたかを知る必要があります。
-event でこれを実行しようとしましたが、OnLoaded
ここでデータ バインディングを実行すると、それらの要素をトラバースした直後に、まだ存在していないようです ( VisualTreeHelper
-class は、ノード)。ご覧のとおり、私は立ち往生しています。
どんな助けでも大歓迎です。
編集: リクエストに応じて、何が起こっているかについての詳細情報を次に示します。
Myには、非同期で読み込まれた画像 ( delay.LowProfileImageLoaderのおかげ) や四角形など、List
いくつかのカスタム (それほど複雑ではない) オブジェクトが取り込まれます。
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>
分離コード:
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;
}
項目自体はメモリ内にある (アプリケーションの初期段階で REST からフェッチされる) ため、すぐに利用できるはずです。
私が解決しようとしている問題は、この特定のビューでの読み込み時間がかなり長いことです (これらのアイテムが約 140 作成され、フィルタリングされて不透明度が変更されます)。