5 Stimmen

ContextMenu im DataTemplate-Bindungsproblem

Ich habe ein Kontextmenü im LongListSelector. Diese Liste wird zur Laufzeit erstellt und aktualisiert.

Hier ist die Methode, die das Klickereignis des Menüpunkts behandelt

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 füllt die Liste SavedGames auf

public ObservableCollection 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 gefüllt wird, funktioniert es perfekt, aber wenn sich die Sammlungen ändern (alte Elemente gelöscht werden, neue hinzugefügt werden), beobachte ich ein eigenartiges Verhalten. Wenn das OnClick-Ereignis ausgelöst wird, sehe ich, dass menuItem.DataContext nicht für das Menüelement ist, auf das ich geklickt habe, sondern für einige alte Menüelemente, die gelöscht wurden.

8voto

Poken1151 Punkte 560

Ich kann keinen Kommentar zu deinem Beitrag hinterlassen, daher sage ich es hier:

Dies ist ein bekanntes Problem, mit dem auch ich zu kämpfen hatte. Ich habe keinen Weg gefunden, dieses Problem vollständig zu lösen, und habe keine aktuellen Lösungen gesehen. Du kannst meinen Beitraghier ansehen, um sicherzustellen, dass das Problem dem deinen entspricht.

Die einzige Lösung, die ich bisher gesehen habe, wird hier in einem msdn Blog aus '11 beschrieben. Es identifiziert das Problem im Silverlight Framework und bietet einen Workaround an, den ich implementiert habe. Füge die Klassendatei in dein Projekt ein und nutze die XAML-Tags, damit dein Kontextmenü im Gleichklang mit dem Datenkontext des übergeordneten Elements bleibt. Dabei bin ich auf eine kleine Nebenwirkung gestoßen, es ist also nur ein vorübergehender Fix.

Ich habe auch gehört, dass es sich um ein bekanntes Problem ohne Lösung handelt, aber ein Patch könnte möglicherweise unter codeplex hier gefunden werden. Mein Problem mit dem Patch war, dass ich nicht herausfinden konnte, wie ich ihn implementieren soll, und außerdem wurde das LLS (was ich für das ContextMenu verwende) direkt in das SDK migriert, also war ich festgefahren.

Das ist alles, was ich zu dem Problem herausgefunden habe, ich hoffe, es hilft. Wenn jemand noch etwas hinzuzufügen hat, bitte gerne.

Update: Unter Verwendung einiger der oben bereitgestellten Links denke ich, dass ich eine etwas bessere Lösung gefunden habe. Im ContextMenu Unloaded Event, aktualisiere die Ansicht. Etwas in der Art von:

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

Dies ist im Grunde das, was der Patch im Blog tut. Nur in einem völlig anderen Kontext. Meine Probleme waren eine Unfähigkeit, Funktionen wie ScrollTo() zu verwenden. Indem man dies im Code-Behind der tatsächlichen Seite macht, scheint das Problem mit der ContextMenu-Bindung behoben zu sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X