Я работаю с древовидным представлением WPF совсем недавно, и у меня действительно ужасное время, когда я пытаюсь отобразить выбранный элемент на экране, когда пользователь использует функцию поиска, которая устанавливает свойство IsSelected наобъект поддержки.
В настоящее время мой подход использует метод в этом ответе: https://stackoverflow.com/a/34620549/800318
private void FocusTreeViewNode(TreeViewEntry node)
{
if (node == null) return;
var nodes = (IEnumerable<TreeViewEntry>)LeftSide_TreeView.ItemsSource;
if (nodes == null) return;
var stack = new Stack<TreeViewEntry>();
stack.Push(node);
var parent = node.Parent;
while (parent != null)
{
stack.Push(parent);
parent = parent.Parent;
}
var generator = LeftSide_TreeView.ItemContainerGenerator;
while (stack.Count > 0)
{
var dequeue = stack.Pop();
LeftSide_TreeView.UpdateLayout();
var treeViewItem = (TreeViewItem)generator.ContainerFromItem(dequeue);
if (stack.Count > 0)
{
treeViewItem.IsExpanded = true;
}
else
{
if (treeViewItem == null)
{
//This is being triggered when it shouldn't be
Debugger.Break();
}
treeViewItem.IsSelected = true;
}
treeViewItem.BringIntoView();
generator = treeViewItem.ItemContainerGenerator;
}
}
TreeViewEntry
- это мой тип данных поддержки, который имеет ссылку на его родительский узел.Leftside_TreeView
- это виртуализированный TreeView, который связан со списком моих объектов.Отключить виртуализацию нельзя, так как при ее отключении производительность действительно плохая.
Когда я ищу объект и обнаруживается объект данных поддержки, я вызываю этот метод FocusTreeViewNode () с объектом в качестве его параметра.Обычно он работает при первом вызове, выбирая объект и выводя его на экран.
При выполнении поиска второй раз, узел для выбора передается, однако вызывается ContainerFromItem (), когда стекОпорожненный (поэтому он пытается создать контейнер для самого объекта) возвращает ноль.Когда я отлаживаю это, я вижу объект, который я ищу, в списке элементов ContainerGenerator, но по какой-то причине он не возвращается.Я посмотрел все, что нужно сделать с UpdateLayout () и другие вещи, но я не могу понять это.
Некоторые объекты в контейнере могут быть вне страницы, даже после того, как родительский узел перенесенв поле зрения - например, экспандер имеет под ним 250 элементов, и только 60 визуализируются одновременно.Может ли это быть проблемой?
Обновление
Вот пример проекта, который создает виртуальное древовидное представление, показывающее эту проблему.https://github.com/Mgamerz/TreeViewVirtualizingErrorDemo
Создайте его в VS, затем в поле поиска введите что-то вроде 4. Нажмите несколько раз поиск, и он выдаст исключение, сообщающее, что контейнер пуст, даже если вы откроете объект generator
Вы можете ясно видеть, что это в генераторе.