在重新加载数据时保存 WPF TreeView 的状态

7

我正在使用TreeView在UI中显示我的数据。现在我的应用程序每5秒刷新一次,以显示最新的数据。是否有一种方法可以在窗口重新加载后保存我的TreeView的展开状态或折叠状态?因为如果我有大量的数据,并且我需要花费超过5秒钟的时间才能到达所需的数据,那么每5秒钟窗口刷新时,TreeView就会折叠,我必须从头开始。

      <TreeView ItemsSource="{Binding Sections}" Grid.Row="1"
          ItemTemplate="{StaticResource sectionTemplate}" >

        <TreeView.Resources> 
          <Style TargetType="TreeViewItem"> 
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
          </Style> 
        </TreeView.Resources> 

    </TreeView>

public ObservableCollection<MyViewModel> =new ObservableCollection<MyViewModel>();

public bool IsExpanded
    {
      get { return (bool)GetValue(IsExpandedProperty); }
      set { SetValue(IsExpandedProperty, value); }
    }
    public static readonly DependencyProperty IsExpandedProperty = DependencyProperty.Register("IsExpanded", typeof(bool), typeof(MyViewModel));


 if (result.TotalResults > 0)
      {
        foreach (DomainObject obj in result.ResultSet)
        {
          AT myAT= (AT)obj;
          arrdep.Add(myAT);
        }
      }

你是每5秒钟重新创建Sections集合吗? - Rachel
是的,窗口每5秒重新加载/刷新一次。因此,我将其作为可观察集合,先清空再填充对象。 - developer
哦,那么你的IsExpanded属性也会在每5秒钟清除一次。有没有可能只更新值而不是删除它们并重新创建它们? - Rachel
树视图是“Sections”(节)的可视化表示,因此重新构建“Sections”(节)就相当于重新构建树视图。 - Rachel
也许另一种选择是在 CodeBehind 中构建 Sections 的副本,并将 TreeView 绑定到该副本。每当实际的 Sections 集合发生更改时,构建一个东西将更改合并到副本中(不要重新创建副本-而是使用更改修改现有对象或添加/删除新项)。 - Rachel
我已经编辑了我的代码。我尝试着不刷新整个窗口,而是只更新数据。但是节点仍然无法保存状态... - developer
1个回答

16

我通过向我的TreeView绑定的对象添加IsExpanded和IsSelected属性来解决了这个问题。

<Style TargetType="{x:Type TreeViewItem}">
    <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>

2
这取决于你的TreeView绑定的是什么。如果它绑定的是自定义对象列表,那很简单,只需添加两个公共布尔属性,分别命名为IsExpanded和IsSelected。设置它们时不需要做任何操作,它们默认为False,并在用户展开/折叠/选择树视图项时进行更新,因为它使用了双向绑定。 - Rachel
它对我也不起作用,我认为这是错误的。你能再具体一点吗? - Manolete
2
@Manolete,“IsExpanded”和“IsSelected”属性需要在TreeViewItem的数据上下文中。因此,如果您的TreeView绑定到一个ObservableCollection<SomeItem>,那么SomeItem需要具有IsExpandedIsSelected属性。 - Rachel
这是一个如此美妙而简单的解决方案!谢谢你! - oxfn
@Grochni,那你的解决方案是什么? - Mark Richman
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接