Ottenere l'albero ViewItem sugli articoli appena creati
-
28-09-2020 - |
Domanda
Deve esserci un modo migliore quindi quanto segue per ottenere "ChildItem"
TaskItem task = (sender as Canvas).DataContext as TaskItem;
TaskItem child = Tasks.CreateTask("New task", task);
TreeViewItem item = treeView.ItemContainerGenerator.ContainerFromItem(task) as TreeViewItem;
item.UpdateLayout();
TreeViewItem childItem = null;
foreach (var i in item.GetDescendantContainers())
{
if (i.GetItem() == child)
childItem = i;
}
.
per qualche motivo oggetto.Itemgenerator.ContainerFromitem (Bambino) non funziona (deve essere dovuto all'articolo appena stato creato)
Soluzione
La generazione del contenitore dell'articolo è asincrono, quindi non è possibile assumere che il contenitore esisterà non appena è stato aggiunto l'oggetto.Avrai bisogno di allegare un gestore al ItemContainergenenerator.StatusCoded Event Quindi il tuo codice sarà informato quando la generazione di container è completa.
DR.WPF's Blog Entry "ArticoliControl: 'G' è perGeneratore " ha una buona descrizione del problema e fornisce un esempio di utilizzo di uno statuscanged:
private void AddScooby()
{
_scooby = new Character("Scooby Doo");
Characters.Add(_scooby);
CharacterListBox.ItemContainerGenerator.StatusChanged
+= OnStatusChanged;
}
private void OnStatusChanged(object sender, EventArgs e)
{
if (CharacterListBox.ItemContainerGenerator.Status
== GeneratorStatus.ContainersGenerated)
{
CharacterListBox.ItemContainerGenerator.StatusChanged
-= OnStatusChanged;
ListBoxItem lbi = CharacterListBox.ItemContainerGenerator
.ContainerFromItem(_scooby) as ListBoxItem;
if (lbi != null)
{
lbi.IsSelected = true;
}
}
}
. Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow