2012-04-11 7 views
0

In den Code hinter meiner Silverlight-Anwendung muss ich die TreeView neu auffüllen und dann ein bestimmtes TreeViewItem ausgewählt.Programmgesteuert wählen Sie ein bestimmtes TreeViewItem in einem ungebundenen TreeView

Der Code selbst ist ziemlich einfach, hier ist es (ich werde trimmen und Pseudo-Code-ify es es so kurz wie möglich zu machen)

private void Button_Click() 
{ 
    Guid idToSelect = TellMeWhatToSelect(); 
    List<myObject> myDataList = myObjectRepository.RetrieveData().ToList(); 

    myTreeView.Items.Clear(); 
    foreach(myObject o in myDataList) 
    { 
     myTreeView.Items.Add(new TreeViewItem() { Content = o.DataField, Tag = o.Id }); 
    } 

    myTreeView.Items.First(o => ((Guid)(o as TreeViewItem).Tag).Equals(idToSelect)).IsSelected = true; 

} 

Das ist im Grunde ist es: ich bin lese einige Daten in myDataList, dann fahre ich hindurch und erstelle so viele TreeViewItem s wie benötigt, um die Daten anzuzeigen.

Problem ist, myTreeView.SelectedItem ist Null am Ende dieser, und SelectionChanged Ereignis wird nicht ausgelöst. Ich würde denken, dass, seit Items Sammlung wurde gelöscht und neu gefüllt, schalten IsSelected auf einem der Elemente würde wie klicken, aber es scheint es nicht).

Seltsamerweise (für mich zumindest), Ausgabe myTreeView.Items.First().IsSelected = true; von selbst (dh Aufruf einer Methode mit dieser einzelnen Codezeile innerhalb) funktioniert wie erwartet: SelectedItem ist da und alle Ereignisse werden entsprechend ausgelöst.

Was ist falsch mit meinem Code und/oder was fehlt mir? Es sieht so aus, als ob Gegenstände aufgeräumt werden.

Ich bin ziemlich sicher, dass andere ähnliche Probleme hatten, aber eine Reihe von Suchanfragen, die ich versuchte, hat nicht geholfen (die meisten der Fragen &, die ich kam, sind WPF-bezogen).

Vielen Dank für Ihre Zeit, ich werde mehr Informationen zur Verfügung stellen, wenn nötig. Entschuldigung für die Textwand.

UPDATE

ändern Code wie folgt, jetzt funktioniert das Verfahren wie erwartet.

private void Button_Click() 
{ 
    Guid idToSelect = TellMeWhatToSelect(); 
    List<myObject> myDataList = myObjectRepository.RetrieveData().ToList(); 

    myTreeView.Items.Clear(); 
    foreach(myObject o in myDataList) 
    { 
     myTreeView.Items.Add(new TreeViewItem() { Content = o.DataField, Tag = o.Id }); 
    } 

    Dispatcher.BeginInvoke(()=> 
    {   
     myTreeView.Items.First(o => ((Guid)(o as TreeViewItem).Tag).Equals(idToSelect)).IsSelected = true; 
    }); 
} 

Antwort

1

Set Eigenschaft IsSelected innerhalb von Dispatcher.BeginInvoke.

+0

an Ort und Stelle! Ich werde meine Frage aktualisieren, um den aktualisierten Code anzuzeigen. Vielen Dank. – Alex

+0

Lassen Sie mich eine Erklärung hinzufügen: Nachdem ich das richtig verstanden habe, haben Sie versucht, die visuelle Darstellung der Steuerung zu aktualisieren, bevor sie erstellt wurde. – RredCat

+0

Ja, das muss das Problem gewesen sein. Seltsamerweise konnte ich die Auswahl "bewegen" sehen, da die Auswahlbox tatsächlich * geändert wurde, aber die Anwendung "dachte", es gab keine Auswahl. – Alex

0

ich das gleiche Problem vor einiger Zeit hatte, habe ich durch den Aufruf der UpdateLayout Methode aus dem treeview gelöst, bevor die TreeViewItem als selected.Like Einstellung dieser:

myTreeView.UpdateLayout(); 
myTreeView.Items.First(o => ((Guid)(o as TreeViewItem).Tag).Equals(idToSelect)).IsSelected = true;