WPF: Select TreeViewItem broken past the root level

后端 未结 3 1001
太阳男子
太阳男子 2020-12-18 15:29

I\'m trying to select a TreeViewItem by ID, but having problems getting it to work past the first (root) level. I\'ve done so much reading round on this and am using the met

3条回答
  •  粉色の甜心
    2020-12-18 16:16

    The problem is that the nested ItemContainerGenerators aren't generated all at the beginning, they are generated on-demand. And even more so, they are generated in a separate thread, so you have to listen to a StatusChanged on the generator to be sure it is ready =(

    Some people suggest to play with the Dispatcher (like in this Bea's post). I tried to implement the Dispatcher solution, but it didn't work for some reason... the generators are still empty =(

    So I ended up with another one, where you specifically ask the tree to update its layout, which causes the generation for the expanded nodes. Here's the final method... you might want to test it a little to verify that it suites your needs. It might collapse some nodes that were expanded before its run.

        private static bool SetSelected(TreeView treeView, ItemsControl parentControl, INestable itemToSelect)
        {
            if (parentControl == null || itemToSelect == null)
            {
                return false;
            }
            foreach (INestable item in parentControl.Items)
            {
                TreeViewItem container = parentControl.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
    
                if (item.ID == itemToSelect.ID)
                { // just comparing instances failed
                        container.IsSelected = true;
                        container.Focus();
                        return true;
                }
                container.IsExpanded = true;
                treeView.UpdateLayout();
                WaitForPriority(DispatcherPriority.Background);
                if (SetSelected(treeView, container, itemToSelect))
                    return true;
                else
                    container.IsExpanded = false;
            }
            return false;
        }
    

提交回复
热议问题