3

詳細ページには、リストビューと、リストビューで選択したアイテムに応じて詳細を表示するコントロールがあります。メインページには、このコレクションのいくつかのアイテムが表示されています(詳細ページにも表示されています)。ユーザーがそれらの1つをクリックすると、詳細ページに移動して詳細が表示されます。残念ながら、ユーザーがメインページのアイテムをクリックするたびに、selection-changedイベントが2回発生します。最初のアイテム(デフォルトアイテム)に対して1回、選択されたアイテムに対して1回です。どうすればこれを正しく処理できますか?-必要なのは2番目の(実際の)イベントだけです。

この投稿を見つけましたが、問題を解決できませんでした...

これは私のコードです(短縮):

MainPage.xaml:

<GridView
    x:Name="itemGridView"
    ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"
    ItemTemplate="{StaticResource Custom250x250ItemTemplate}"
    SelectionMode="None"
    IsItemClickEnabled="True"
    ItemClick="ItemView_ItemClick">

    <!-- details -->

 </GridView>

MainPage.xaml.cs:

 void ItemView_ItemClick(object sender, ItemClickEventArgs e)
 {
    // Navigate to the appropriate destination page, configuring the new page
    // by passing required information as a navigation parameter
    var itemId = ((ArticleDataItem)e.ClickedItem).Id;
    this.Frame.Navigate(typeof(ItemDetailPage), itemId);
 }

ItemDetailPage.xaml:

 <ListView
    x:Name="itemListView"
    ItemsSource="{Binding Source={StaticResource itemsViewSource}}"
    IsSwipeEnabled="False"
    SelectionChanged="ItemListView_SelectionChanged"
    ItemTemplate="{StaticResource Standard130ItemTemplate}" 
    ItemContainerStyle="{StaticResource CustomListViewItemStyle}" 
    />

 <!-- ... -->

 <WebView x:Name="contentBrowser" />

ItemDetailPage.xaml.cs:

 void ItemListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
 {
    // this event gets raised two times when navigating from the MainPage to this page !!!

    // Invalidate the view state when logical page navigation is in effect, as a change
    // in selection may cause a corresponding change in the current logical page.  When
    // an item is selected this has the effect of changing from displaying the item list
    // to showing the selected item's details.  When the selection is cleared this has the
    // opposite effect.
    if (this.UsingLogicalPageNavigation()) this.InvalidateVisualState();

    if (itemsViewSource.View.CurrentItem == null)
    {
         return;
    }

    // reset contentBrowser-Content 
    contentBrowser.NavigateToString(Tasks.WebViewPreCode + "<p>Loading...</p>" + Tasks.WebViewAfterCode);

    var selectedItem = (ArticleDataItem)this.itemsViewSource.View.CurrentItem;

    if ( selectedItem == null )
    {
         contentBrowser.NavigateToString(Tasks.WebViewPreCode + "<p>There was an error. Please try again later.</p>" + Tasks.WebViewAfterCode);
        return;
    }

    // Download item details
    ArticleDataSource.ReadArticle(selectedItem); // this really shouldn't be called two times

}

ご協力ありがとうございました!

4

3 に答える 3

1

XAML コードから SelectionChanged ハンドラーを削除します。コード ビハインドで、SelectedIndex を -1 (または、存在する場合は既定の項目のインデックス) に設定し、SelectedIndex を設定した後にハンドラーを追加します。

EDIT:背景を説明するために、リストビューの選択されたアイテムがプログラムで変更された場合(たとえば、SelectedIndexまたはSelectedItemプロパティに新しい値を割り当てた場合)、SelectionChangedイベントも発生します。ItemsSource も変更したときに起動するかどうかはよくわかりませんが、そうなると思います。したがって、初期化の完了後にイベント ハンドラーを追加する必要があります。

于 2012-10-06T13:52:37.953 に答える
1

私は同じ問題を実験しました。「SelectionChanged」イベントが 2 回登録されていることがわかりました。1 回はページ コンストラクターで、もう 1 回は *.g.cs ファイルで、「デザイナー」ファイルのように見えます。

deクラスのコンストラクターでselectionchanged登録を削除して解決しました。

お役に立てれば幸いです。

于 2014-12-29T13:58:17.633 に答える
-1

SelectionChanged イベントで何に応答するかを決める必要があると思います (おそらく、選択されているものを選択解除したいですか? 何をしようとしているのかわかりません)。おそらく、この投稿が役立つかもしれません。

于 2012-10-03T20:49:15.937 に答える