Obtenir l'arbreViewItem sur les articles nouvellement créés
-
28-09-2020 - |
Question
Il doit y avoir une meilleure façon, alors ce qui suit pour obtenir "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;
}
Pour une raison quelconque de raison.ItemGenerator.ContainerFromitem (enfant) ne fonctionne pas (doit être dû à l'élément qui vient d'être créé)
La solution
La génération de conteneurs d'élément est asynchrone. Vous ne pouvez donc pas supposer que le conteneur existe dès que l'élément a été ajouté.Vous devrez joindre un gestionnaire au itemContainer.Statuschanged événement afin que votre code soit informé lorsque la génération de conteneurs est terminée.
dr.Entrée de blog de WPF "" ArticlesControl: "G" est pourGénérateur " a une bonne description du problème et fournit un exemple d'utilisation de StatusChanged:
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;
}
}
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow