0

Windows Phone 7 アプリケーションがビューを開くと、特定の順序に従って作成されます。コンストラクターとイベントに関する限り、次の順序が正しいことがわかりました。

  1. Constructor
  2. OnNavigatedTo
  3. 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 作成され、フィルタリングされて不透明度が変更されます)。

4

1 に答える 1

0

あなたは次のようなことをしていると思います:

myListBox.ItemSource=myList;

ListBox の ItemSource を設定すると、List の変更は常に ListBox に反映されます。ListBox が空の場合、その理由は、List が適切に取り込まれていないかBindings、ItemTemplate で無効であることが原因である必要があります。メソッドにブレークポイントを挿入して、リストにアイテムがあるかどうかをデバッグして確認する必要がありますLoaded()。また、リストに含まれるアイテムや、アプリケーションのどこにデータが入力されているかについても言及していませんか? 不完全な情報は誰の助けにもなりません。

于 2012-07-09T07:14:35.420 に答える