2013-01-21 22 views
5

Ich habe ein Kontextmenü in LongListSelector. Diese Liste wird in Runtime erstellt und aktualisiert.ContextMenu in DataTemplate Bindungsproblem

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

Hier ist die Methode, die

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

Die folgende Methode auffüllt

Liste der SavedGames auf dem Menüpunkt klicken Ereignis behandelt
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"); 
    } 

Also, wenn die SavedGames Sammlung zum ersten Mal populaed ist Es funktioniert perfekt, aber wenn sich die Sammlungen ändern (einige alte Elemente löschen, neue hinzufügen), beobachte ich seltsames Verhalten. Wenn das OnClick-Ereignis ausgelöst wird, sehe ich menuItem.DataContext nicht für den Menüeintrag, auf den ich geklickt habe, sondern für einige alte Menüelemente, die gelöscht wurden.

+0

Wenn sich Ihre Sammlung ändert, machen Sie auch Ihre Menüpunkte? Ich denke, dass es etwas damit zu tun hat, wie die Bindung gemacht wird und eine Seite nicht aktualisiert wird. –

+0

Beispiel: RemoveSave_OnClick kann das Element jedes Mal entfernen, wenn es RescanSaves aufruft, wodurch die Sammlung gelöscht und erneut ausgefüllt wird – Shedon

Antwort

8

Ich kann keinen Kommentar abgegeben auf Sie Post sind so ich hier sagen werde:

Dies ist ein bekanntes Problem und eine, die ich auch haben. Ich habe keine Möglichkeit gefunden, dieses Problem vollständig zu lösen, und habe keine aktuellen Lösungen gefunden. Sie können meinen Beitrag here sehen, um sicherzustellen, dass das Problem mit Ihrem Problem in Einklang steht.

Die einzige Lösung, die ich bisher gesehen habe, ist hier in einer msdn blog from '11 beschrieben. Es identifiziert das Problem im Silverlight Framework und er bietet einen Workaround, den ich implementiert habe. Fügen Sie die Klassendatei in Ihr Projekt ein und verwenden Sie die XAML-Tags, damit Ihr Kontextmenu mit dem Datenkontext des Parents synchronisiert werden kann. Ich habe einen kleinen Nebeneffekt davon bekommen, also ist es nur ein Pflaster.

Ich habe auch festgestellt, aus einem anderen Forum, dass es ein bekanntes Problem ohne Lösung ist, aber ein Patch kann bei codeplex here gefunden werden. Mein Problem mit dem Patch ist, dass ich nicht herausfinden konnte, wie man es implementiert, und auch das LLS (mit dem ich das ContextMenu verwende) ist direkt in das SDK migriert, also war ich festgefahren.

Das ist alles, was ich auf das Problem ausgegraben habe, hoffe es hilft. Wenn jemand anderes hinzufügen muss, bitte tun.

Update: Mit einigen der oben genannten Links, ich denke, ich habe eine etwas bessere Lösung. Aktualisieren Sie die Ansicht im ContextMenu Unloaded-Ereignis. Etwas wie:

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

Dies ist im Wesentlichen, was der Patch im Blog tut. Nur in einem völlig anderen Kontext. Meine Probleme waren die Unfähigkeit, Funktionen wie ScrollTo() zu benutzen. Wenn Sie dies im Code hinter der eigentlichen Seite tun, scheint das ContextMenu-Bindungsproblem zu beheben.