2017-10-11 4 views
-1

J'ai un élément ListBox dans xaml qui obtient ListBoxItems à partir d'une méthode qui lit les éléments du fichier xml.Renvoie une valeur de la méthode initiée par l'événement SelectionChanged

J'ai la liste chargée avec succès, et j'ai aussi une fonction qui peut ajouter des éléments à la liste via l'application. Maintenant, j'ai besoin d'un moyen de supprimer les éléments. Je veux obtenir un élément à supprimer en sélectionnant un ListBoxItem de la liste. Ce que j'avais à l'esprit est d'utiliser l'événement SelectionChanged puis utilisez le code suivant:

string selected; 

    private void XMLista_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     brisanjeDugme.IsEnabled = true; 
     selected = XMLista.SelectedItem.ToString(); 

    } 

alors j'utiliser pour ouvrir le fichier machineList.xml puis en fonction de la valeur retirer il y a le nœud parent si le noeud est égal au ListBoxItem sélectionné.

Voici donc la méthode pour l'enlèvement:

private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 


     XDocument root = XDocument.Load("machineList.xml"); 
     root.Descendants("stampac").Where(p => p.Element("IP").Value == selected).Remove(); // <- selected variable is used here. 
     root.Save("machineList.xml"); 

     XMLista.Items.Clear(); 
     ListBox_Load(sender, e); 
     brisanjeDugme.IsEnabled = false; 

    } 

Cependant, je vais avoir des problèmes avec l'aide de la variable sélectionnée dans la méthode ci-dessus, je reçois une erreur System.NullReferenceException indiqué dans la méthode XMLista_SelectionChanged, ligne où J'ai défini la variable sélectionnée. Je ne comprends pas pourquoi je reçois cela, quand je m'assure que le bouton ne peut être appuyé que si j'ai un listbox choisi (et j'ai testé la valeur reçue dans la boîte de message, qui affiche la valeur correcte).

Des idées?

+0

Salut Nikola. Vous avez écrit une longue question, avec des détails sur ce que vous voulez faire dans votre projet, mais vous n'avez pas fourni une pile pour l'exception ... Essayez de réécrire cette question afin que nous puissions vous aider, enlever les détails inutiles pour comprendre le problème. –

+0

@swiszcz J'ai essayé de poster ma question mieux. Faites-moi savoir s'il manque quelque chose, et merci pour l'aide (et le conseil). –

Répondre

1

Vérifiez que les éléments ont été initialisés et qu'il ya un élément sélectionné:

private void XMLista_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (brisanjeDugme != null) 
     brisanjeDugme.IsEnabled = true; 
    if(XMLista != null && XMLista.SelectedItem != null) 
     selected = XMLista.SelectedItem.ToString(); 
} 
+0

J'ai testé cela et cela fonctionne. Mais je ne comprends pas? J'ai été assez positif que j'obtiens la valeur nécessaire pour le retrait au travail (j'ai même inclus la boîte à message pour me le dire une fois choisi). Comment cela fonctionne différemment? –

+0

Le gestionnaire d'événements SelectionChanged peut être appelé avant l'initialisation des éléments. – mm8

0

Merci pour l'édition post.

Je vous recommande d'utiliser ObservableCollection<string> pour conserver votre liste d'éléments à afficher et lier cette collection observable à XMLista.ItemsSource (ou affecter dans le code derrière). Opérez maintenant sur cette ObsevableCollection uniquement (ajoutez ou supprimez des éléments). C'est la façon recommandée d'utiliser les contrôles de collection dans WPF et personne n'a de problèmes avec ça.

Je suppose que l'exception que vous obtenez peut être provoquée par un fonctionnement erroné sur le niveau XMLista.Items.