詳細ページには、リストビューと、リストビューで選択したアイテムに応じて詳細を表示するコントロールがあります。メインページには、このコレクションのいくつかのアイテムが表示されています(詳細ページにも表示されています)。ユーザーがそれらの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
}
ご協力ありがとうございました!