5

LongListSelectorにコンテキストメニューがあります。このリストは実行時に作成および更新されます。

<phone:PanoramaItem Header="{Binding Path=LocalizedResources.SavedGamesHeader, Source={StaticResource LocalizedStrings}}" Orientation="Horizontal">
            <phone:LongListSelector Margin="0,0,-22,2" ItemsSource="{Binding SavedGames}">
                <phone:LongListSelector.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Vertical" Margin="12,2,0,20" Width="432">
                            <toolkit:ContextMenuService.ContextMenu>
                                <toolkit:ContextMenu>
                                    <toolkit:MenuItem Header="Remove" Click="RemoveSave_OnClick"/>
                                </toolkit:ContextMenu>
                            </toolkit:ContextMenuService.ContextMenu>
                            <Image Margin="10,5,10,0"  Height="173" Width="248" Source="{Binding Screen}" Stretch="Fill" HorizontalAlignment="Left"></Image>
                            <StackPanel Width="311" Margin="8,5,0,0" HorizontalAlignment="Left">
                                <TextBlock Tap="Save_OnTap" Tag="{Binding SavedGame}" Text="{Binding SaveName}" TextWrapping="Wrap" Margin="10,0" Style="{StaticResource PhoneTextExtraLargeStyle}" FontSize="{StaticResource PhoneFontSizeMedium}" Foreground="White" FontWeight="Bold" FontFamily="Arial Black" HorizontalAlignment="Left" />
                                <TextBlock Text="{Binding GameName}" TextWrapping="Wrap" Margin="10,-2,10,0" Style="{StaticResource PhoneTextSubtleStyle}" HorizontalAlignment="Left" />
                                <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
                                    <TextBlock Text="Created on:" Margin="10,-2,10,0" Style="{StaticResource PhoneTextSubtleStyle}" />
                                    <TextBlock Text="{Binding Created}" TextWrapping="Wrap" Margin="5,-2,10,0" Style="{StaticResource PhoneTextSubtleStyle}" />
                                </StackPanel>
                            </StackPanel>
                        </StackPanel>
                    </DataTemplate>
                </phone:LongListSelector.ItemTemplate>
            </phone:LongListSelector>
        </phone:PanoramaItem>

メニュー項目のクリックイベントを処理するメソッドは次のとおりです

private void RemoveSave_OnClick(object sender, RoutedEventArgs e)
    {
        var menuItem = (MenuItem)sender;
        var saveViewModel = menuItem.DataContext as SavesViewModel;
        EmuStorageMgr.Instance.DeleteSave(saveViewModel.SavedGame.SaveFolder);
        App.ViewModel.RescanSaves();
    }

次のメソッドは、SavedGamesリストにデータを入力します

public ObservableCollection<SavesViewModel> SavedGames { get; private set; }
public void RescanSaves()
    {
        SavedGames.Clear();
        var saves = EmuStorageMgr.Instance.GetSaves();
        foreach (var save in saves)
        {
            SavedGames.Add(new SavesViewModel(save));
        }
        this.IsSavesLoaded = true;
        NotifyPropertyChanged("SavedGames");
    }

したがって、SavedGamesコレクションが初めて作成されたときは完全に機能しますが、コレクションが変更されたとき(古いアイテムを削除したり、新しいアイテムを追加したり)、奇妙な動作が見られます。OnClickイベントが発生すると、menuItem.DataContextは、クリックしたメニューアイテムではなく、削除された古いメニューアイテム用であることがわかります。

4

1 に答える 1

8

あなたの投稿にコメントを残すことができないので、ここで言います。

これは既知の問題であり、私も抱えている問題です。この問題を完全に解決する方法が見つからず、最近の解決策も見当たりません。ここで私の投稿を見て、問題があなたのものと一致していることを確認してください。

これまでに見た唯一の解決策は、'11 の msdn ブログで説明されています。それは Silverlight フレームワークの問題を特定し、彼は私が実装した回避策を提供します。プロジェクトにクラス ファイルを含め、XAML タグを使用すると、コンテキスト メニューが親のデータ コンテキストと同期し続けることができます。私はそれを使用して小さな副作用に遭遇したので、それは単なるバンドエイドです.

また、別のフォーラムから、これは解決策のない既知の問題であるとの情報も見つかりましたが、パッチはcodeplex hereで見つかる可能性があります。パッチに関する私の問題は、それを実装する方法を理解できなかったことと、LLS (ContextMenu を使用しているもの) が SDK に直接移行されたため、行き詰まったことです。

私が問題を掘り下げたのはこれだけです。他の誰かが追加する必要がある場合は、追加してください。

更新: 上記のリンクにあるもののいくつかを使用すると、少し良い解決策があると思います. ContextMenu Unloaded イベントで、ビューを更新します。何かのようなもの:

    private void add_but_up(object sender, RoutedEventArgs e)
    {
        ContextMenu conmen = (sender as ContextMenu);
        conmen.ClearValue(FrameworkElement.DataContextProperty);
    }

これは基本的に、ブログのパッチが行うことです。完全に異なるコンテキストでのみ。したがって、私の問題は、ScrollTo() などの関数を使用できないことでした。実際のページのコード ビハインドでこれを行うと、ContextMenu バインディングの問題が修正されるようです。

于 2013-01-22T02:52:06.173 に答える