Binding SelectedItem in a HierarchicalDataTemplate-applied WPF TreeView

后端 未结 3 1796
迷失自我
迷失自我 2020-12-14 03:44

I have a data-bound TreeView and I want to bind SelectedItem. This attached behavior works perfectly without HierarchicalDataTemplate

3条回答
  •  天涯浪人
    2020-12-14 03:59

    If you find, like I did, that this answer sometimes crashes because itemPresenter is null, then this modification to that solution might work for you.

    Change OnSelectedItemChanged to this (if the Tree isn't loaded yet, then it waits until the Tree is loaded and tries again):

    private static void OnSelectedItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        Action selectTreeViewItem = tvi2 =>
        {
            if (tvi2 != null)
            {
                tvi2.IsSelected = true;
                tvi2.Focus();
            }
        };
    
        var tvi = e.NewValue as TreeViewItem;
    
        if (tvi == null)
        {
            var tree = ((BindableTreeViewSelectedItemBehavior) sender).AssociatedObject;
            if (!tree.IsLoaded)
            {
                RoutedEventHandler handler = null;
                handler = (sender2, e2) =>
                {
                    tvi = GetTreeViewItem(tree, e.NewValue);
                    selectTreeViewItem(tvi);
                    tree.Loaded -= handler;
                };
                tree.Loaded += handler;
    
                return;
            }
            tvi = GetTreeViewItem(tree, e.NewValue);
        }
    
        selectTreeViewItem(tvi);
    }
    

提交回复
热议问题