WPF - Listbox - Clear()/Add()

InvalidOperationException

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour a tous , Je tente d’effacer le contenu d’une listbox WPF lors du clic sur un boutton .. hier j’avais un code qui marchait parfaitement et ce matin je me tappe des InvalidOperationException.

J’ai deja rencontré cette exception lorsque je tentais de modifier une liste sur laquelle je loopais .. mais dans ce cas ci ce n’est pas le cas ..

Voici le code fautif ..

private void Button_ShowViews_Click(object sender, RoutedEventArgs e)
    {
         
        // Nothing selected
        if (lb_Selection.SelectedItems.Count == 0)
            return;
 
        var selectedProjects = GetSelectedProjects();
         
        lb_Selection.Items.Clear(); // InvalidOperationException .. pourtant ma liste n'est pas en utilisation ici ..
         
        foreach (var project in selectedProjects)
        {
            AddViewsToSelectionListbox(project);
        }
        CurrentView = VIEWS_VIEW;
 
        UpdateButtons();
        UpdateSelectionList();
         
    }

Si je remplace la ligne fautive par un lb_Selection.ItemsSource = new List<object>(); Ca passe pour la , mais la fonction qui suit ( AddViewsToSelectionListBox ) lance la meme exception au moment d’apeller .Add pour un element ..

Le plus étrange est que sur le click d’un autre bouton , je fais sensiblement les memes operations ..

// connect button click ..
private void Button_Connect_Click(object sender, RoutedEventArgs e)
    {
        bool isConnected = StarteamHelper.Connect(mServerUrl, mPort, mUsername, mPassword);
 
        if (isConnected)
        {
            FillSelectionListboxWithProjects();
        }
}
 
// Fill selection listbox with project
private void FillSelectionListboxWithProjects()
    {
        lb_Selection.Items.Clear(); // No Exception here
        var projects = StarteamHelper.GetProjectList();
        lb_Selection.ItemsSource = projects;
    }

La seule différence entre les codes est que dans un cas je recupere la liste d’item d’une autre classe , et dans le cas de l’exception , je recuperere les items de la liste elle meme ..

De plus je peut transformer le code du ShowViews en .. et ca fonctionne toujours pas ..

private void Button_ShowViews_Click(object sender, RoutedEventArgs e)
    {
        lb_Selection.Items.Clear(); // Still an exception
    }

J’ai pu regler en faisant .. :

var new_list = new List<object>();

        new_list.Add(VIEW_LIST_TAG);
        selectedProjects.ForEach(project => {
            new_list.Add(PROJECT_PREFIX + project.Name);
            StarteamHelper.GetViewsFromProject(project).ForEach(view => { new_list.Add(view); }); 
        });

        lb_Selection.ItemsSource = new_list;

MAis je ne comprend toujours pas pourquoi dans certains cas je peut utiliser Clear/Add et d’autre gois changer la source ..

Merci d’avance pour votre aide ! -Z-

Édité par Zérotisme

+0 -0

Bonjour Zérotisme,

J’ai l’impression que tu captures l’événement clic Button_ShowViews_Click sur un élément de la liste que tu essayes de vider. Pour lui ça rentre en conflit avec l’objet sender envoyé à ta fonction.

La solution ce serait d’exécuter une fonction asynchrone. Je n’ai pas le contexte et l’interface de ton application, si tu ne trouves toujours pas ce serait bien que tu postes un screenshot avec tes éléments d’interfaces ; histoire que l’on comprenne les bouts & les aboutissants.

Tant de choses, tant de vies, tant de possibilités.

+0 -0
Auteur du sujet

Bonjour Zérotisme,

J’ai l’impression que tu captures l’événement clic Button_ShowViews_Click sur un élément de la liste que tu essayes de vider. Pour lui ça rentre en conflit avec l’objet sender envoyé à ta fonction.

La solution ce serait d’exécuter une fonction asynchrone. Je n’ai pas le contexte et l’interface de ton application, si tu ne trouves toujours pas ce serait bien que tu postes un screenshot avec tes éléments d’interfaces ; histoire que l’on comprenne les bouts & les aboutissants.

Yarflam

Merci de ta reponse ,

En fait , lorsqu’on utilise ListBox.ItemSource = new_source; l’attribut ListBox.Items deviens en lecture seul.

Je m’en suis sorti en creant une nouvelle liste a chaque changements et en l’affectant a ListBox.ItemsSource. ( ce qui selon plusieurs forum , est la bonne pratique avec les lb )

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte