コンテキストメニューで何時間も解決できない深刻な問題に遭遇しました。
問題を再現するために、Visual Studio 2012 で Windows Phone 8 用のアプリ テンプレートを使用してまったく新しい Panorama アプリを作成しました。ナゲット経由で Windows Phone ツールキットをインストールし、Items にバインドされている最初の長いリスト セレクターのデータ テンプレートにコンテキスト メニューを追加しました。
<StackPanel Margin="0,-6,0,12">
<TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" FontSize="{StaticResource PhoneFontSizeExtraLarge}"/>
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu>
<toolkit:MenuItem Header="{Binding LineOne}" Click="MenuItem_Click_1" Tag="{Binding}">
</toolkit:MenuItem>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
</StackPanel>
デバッグを容易にするために、ヘッダーを LineOne プロパティに設定します。次のイベントを添付しました。
private void MenuItem_Click_1(object sender, RoutedEventArgs e)
{
var itemViewModel = (ItemViewModel)((MenuItem)sender).Tag;
App.ViewModel.Items.Remove(itemViewModel);
App.ViewModel.Items.Add(new ItemViewModel { LineOne = "Test", LineTwo = "Test", LineThree = "Test" });
}
アプリを実行し、コンテキスト メニューを使用して最初の項目を削除します。最初の項目が消え、期待どおり、Test という名前の新しい項目がリストの一番下に表示されます。この新しい項目を保持すると、メニュー項目は「ランタイム 1」(削除された項目) にバインドされます。
これはエラーを再現できる最も単純なコードでしたが、実際のアプリでは、さまざまなメソッドやさまざまなページで追加および削除するためのより意味のあるコードで、ほぼ同じ問題が発生しています。コマンドをバインドしましたが、データ バインディングが間違っているため、コマンドは間違ったビュー モデルで間違ったパラメーターで実行されます。
なぜこれが起こっているのですか?