Получение TreeviewItem на вновь созданные предметы
-
28-09-2020 - |
Вопрос
Должен быть лучшим способом, то следующее для получения «детского»
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;
}
.
По какой-то причине item.itemgenerator.containerFromitem (ребенок) не работает (должно быть из-за созданного элемента)
Решение
Элемент Контейнер генерация асинхрона, поэтому вы не можете предположить, что контейнер будет существовать, как только добавлено элемент.Вам нужно будет прикрепить обработчик к itemcocontainergenerator.StatusChanged Event Итак, ваш код будет проинформирован, когда контейнер будет завершен.
dr.Вход в блоге WPF "itemscontrol: 'g' предназначен дляГенератор " имеет хорошее описание проблемы и обеспечивает пример использования 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;
}
}
}
. Не связан с StackOverflow