wpf TreeViewItem BringIntoView 并不总是有效

标签 wpf treeview

在我的 MVVM 应用程序中,我有一个 TreeView ,它应该在选择时将 TreeView 项带入 View 。 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;
  }
} 

这对于已经加载的项目非常有效。

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

如果它们被加载, TreeView 项目将被迭代,直到找到所寻找的项目,找到的项目被选择并且上面的处理程序成功地将其带入 View 。

问题在于尚未加载的项目。在这些情况下,我的代码获取所查找项目的祖先记录,迭代它们并扩展项目(因此加载子项),直到到达所查找的项目。已成功选择,但未进入 View 。

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

[更新] 在 TreeViewItemViewModel 中:

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 属性 =“IsExpanded”值 =“{绑定(bind) IsExpanded,模式 = TwoWay}” Setter Property="IsSelected"Value="{Binding IsSelected, Mode=TwoWay}"

最佳答案

this可能会解决你的问题

并建立在this之上关于在 TreeView 中使用 MVVM 的文章

编辑: 您的 TreeView 项目容器也可能尚未创建。那么你必须摆弄 TreeViews ItemContainerGenerator

关于wpf TreeViewItem BringIntoView 并不总是有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5116650/

相关文章:

WPF 绑定(bind)到自定义控件的属性

c# - WPF C# 获取TreeView的根节点

c# - 如何选中或取消选中 TreeView 中的所有子节点

delphi - 如何将子树从一个 TTreeView 复制到另一个 TTreeView?

wpf - 使用 CommandParameters 和 MultiBindings?

c# - WPF 应用程序在关闭主窗口时不会关闭

具有可排序功能的 jQuery TreeView

c# - 如何根据位置为 TreeNodes 分配编号方案

wpf - 如何设置分组框内子控件的字体?

asp.net - App.Config 和 Web.Config 之间的区别?