2013-01-21 17 views
5

Mam menu kontekstowe w LongListSelector. Ta lista jest tworzona i aktualizowana w środowisku wykonawczym.Menu kontekstowe w DataTemplate Binding issue

<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> 

Oto metoda, która obsługuje zdarzenie click na element menu

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(); 
    } 

Poniższy sposób zapełnia listę o 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"); 
    } 

Tak więc, gdy zbiór SavedGames jest populaed po raz pierwszy działa idealnie, ale gdy zmieniają się kolekcje (usuń stare przedmioty, dodaj nowe), obserwuję dziwne zachowanie. Po uruchomieniu zdarzenia OnClick widzę menuItem.DataContext nie dla pozycji menu kliknięto, ale dla niektórych starych pozycji menu, które zostały usunięte.

+0

Po zmianie kolekcji należy również wybrać pozycje menu? Myślę, że może to mieć coś wspólnego z tym, jak wiązanie jest wykonane i jedna strona nie aktualizuje się. –

+0

na przykład: RemoveSave_OnClick może usunąć przedmiot za każdym razem, gdy wywołuje RescanSaves, który czyści kolekcję i ponownie ją zapełnia – Shedon

Odpowiedz

8

I komentarz nie może pozostawić na stanowisko jesteś tak powiem tutaj:

Jest to znany problem, a jeden, że mam również. Nie znalazłem żadnego sposobu, aby w pełni rozwiązać ten problem i nie widziałem żadnych najnowszych rozwiązań. Możesz zobaczyć mój post here, aby upewnić się, że problem jest zgodny z Twoim.

Jedyne rozwiązanie, które do tej pory widziałem, jest opisane tutaj w msdn blog from '11. Identyfikuje problem w Silverlight Framework i zapewnia obejście, które zaimplementowałem. Dołącz plik klasy do projektu i korzystaj z tagów XAML, dzięki czemu Twoje menu kontekstowe będzie zsynchronizowane z datacontextem rodzica. Natrafiłem na mały efekt uboczny, używając go, więc to tylko pomoc zespołu.

Znalazłem również informację z innego forum, że jest to znany problem bez rozwiązania, ale łatę można znaleźć pod adresem codeplex here. Mój problem z łatą to, że nie mogłem wymyślić, jak ją zaimplementować, a także LLS (z której korzystam z ContextMenu) migrował bezpośrednio do SDK, więc utknąłem.

To wszystko, co wykopałem na problem, mam nadzieję, że pomoże. Jeśli ktoś jeszcze ma coś do dodania, proszę.

Aktualizacja: Korzystanie z niektórych z powyższych linków, myślę, że mam nieco lepsze rozwiązanie. W zdarzeniu Unloaded Context Menu odśwież widok. Coś takiego:

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

To jest zasadniczo to, co łata na blogu. Tylko w zupełnie innym kontekście. Więc moje problemy były niezdolność do korzystania z funkcji takich jak ScrollTo(). Robiąc to w kodzie rzeczywistej strony wydaje się naprawić problem związany z ContextMenu.