wpf TreeViewItem BringIntoView并不总是有效

wpf TreeViewItem BringIntoView并不总是有效,wpf,treeview,Wpf,Treeview,在我的MVVM应用程序中,我有一个treeview,它可以在选择时将treeview项带入视图。树视图表示数据库中的记录。每个treeview项在选中时通过展开项按需加载其子项 treeview样式的定义如下: <TreeView.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="OverridesDefaultStyle" Val

在我的MVVM应用程序中,我有一个treeview,它可以在选择时将treeview项带入视图。树视图表示数据库中的记录。每个treeview项在选中时通过展开项按需加载其子项

treeview样式的定义如下:

  <TreeView.ItemContainerStyle>
    <Style TargetType="{x:Type TreeViewItem}">
      <Setter Property="OverridesDefaultStyle" Value="True"/>
      ...
      <EventSetter Event="Selected" Handler="OnTreeViewItemSelected"/>
private void OnTreeViewItemSelected(object sender, RoutedEventArgs e)
{
  if (!Object.ReferenceEquals(sender, e.OriginalSource))
  {
    return;
  }
  TreeViewItem item = e.OriginalSource as TreeViewItem;
  if (item != null)
  {        
    EventHandler eventHandler = null;
    eventHandler = new EventHandler(delegate
    {
      treeData.LayoutUpdated -= eventHandler;
      item.BringIntoView();
    });
    treeData.LayoutUpdated += eventHandler;
  }
} 
这对于已经加载的项目非常有效

[编辑:事实上,所选项目的父项必须展开,而不仅仅是加载]

如果加载了树项,则会对树项进行迭代,直到找到所需的项,选择所找到的项,并且上面的处理程序成功地将其带入视图

问题在于尚未加载的项目。在这些情况下,我的代码获取所搜索项的祖先记录,在它们之间迭代,并在执行过程中扩展项(因此加载子项),直到到达所搜索项。此选项已成功选择,但未显示在视图中

有人知道如何解决这个问题吗

[更新] 在TreeViewModel中:

public bool IsSelected
{
  get { return _isSelected; }
  set
  {        
    if (value != _isSelected)
    {          
      _isSelected = value;

      if (value == true)          
        IsExpanded = value;          

      this.OnPropertyChanged("IsSelected");
    }
  }
}

public bool IsExpanded
{
  get { return _isExpanded; }
  set
  {
    if (_isExpanded == value)
      return;

    _isExpanded = value;
    this.OnPropertyChanged("IsExpanded");

    if (_isExpanded && 
        _parent != null &&
        _parent.IsExpanded == false)
      _parent.IsExpanded = true;

    LoadChildren();
  }
}
LoadChildren()方法通过使用标志来处理子项是否需要加载

项目容器样式

Setter Property=“IsExpanded”Value=“{Binding IsExpanded,Mode=TwoWay}” Setter Property=“IsSelected”Value=“{Binding IsSelected,Mode=TwoWay}”

可能会解决您的问题

并建立在关于将MVVM用于树视图的文章的基础上

编辑:
还有一种可能是您的treeviewitemcontainers尚未创建。然后你必须摆弄TreeView,好吧,所以我似乎是“偶然”解决了这个问题

如果我在后台进程中运行搜索,则会将所选内容显示在视图中

public void Search()
{
  ImplementSearch();

  _workinghelper = new WorkingHelper();
  SearchWorkingViewModel searchvm = new SearchWorkingViewModel(_workinghelper.WorkingWindow);
  VisualUtils.FadeTreeViewItemViewModel(1.0, 0.2, 0, 100);
  _workinghelper.MakeWorking(searchvm);

  VisualUtils.FadeTreeViewItemViewModel(0.2, 1.0, 0, 001);
}

public bool CanSearch
{
  get { return _searchlogic.SearchTypeIsValid(_searchterm); }
}

void ImplementSearch()
{      
  BackgroundTaskManager.RunBackgroundTask(
    () =>
    {
      bool run_success = _searchlogic.PerformSearch(_searchterm);
      Thread.Sleep(500);
      return run_success;
    },
    (run_success) =>
    {
      if (run_success == false)
        ApplicationSetup.DisableApp((MainWindow)App.Current.MainWindow, "The search function has caused an unexpected internal error. Please contact an administrator for help.");

      if (_workinghelper != null)
        _workinghelper.DisposeWorkingWindow();
    });      
}
然而,如果我只是跑 bool run\u success=\u searchlogic.PerformSearch(\u searchterm);
在ImplementSearch()中,该项未显示。

是的,我已经为TreeView实现了MVVM,并使用了TreeViewItemBehavior attached属性,但问题仍然存在。我会查看ItemContainerGenerator…我仍在努力解决这个问题。我尝试了其他几种解决方案,但问题仍然存在。请注意编辑-事实上,如果加载了父项,则会选择该项,但不会将其带入视图。请发布更多有关itemcontainerstyle的IsSelected和IsExpanded属性的代码。还有在cs端的isselected和isexpanded代码,还有一些关于如何加载子目录项并表示它们已加载的代码