有没有办法获得扩展/折叠TreeView节点的状态?

时间:2010-02-24 15:19:23

标签: wpf xaml treeview

code example显示了如何在 ScrollViewer ScrollToVerticalOffset )中获取滚动条的位置,以便例如如果需要重新创建,可以将滚动条重置为此位置。

有没有办法为TreeView控件执行此操作,即获取用户已扩展的节点索引的集合?

1 个答案:

答案 0 :(得分:4)

最简单的方法是将TreeViewItem.IsExpanded属性绑定到ViewModel,然后浏览模型并进行计算。

我为你写了一个例子。它计算扩展节点的数量,但你可以用扩展的人做任何你想做的事情......

<强> C#:

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;

namespace WpfApplication1
{
  public partial class TestBrowser : Window
  {
    private TreeViewItemViewModel[] _items;

    public TestBrowser()
    {
      InitializeComponent();

        var item1 = new TreeViewItemViewModel();
        var item2 = new TreeViewItemViewModel();
        var item3 = new TreeViewItemViewModel();

        item3.Children.Add(new TreeViewItemViewModel());
        item3.Children.Add(new TreeViewItemViewModel());
        var child3 = new TreeViewItemViewModel();
        child3.Children.Add(new TreeViewItemViewModel());
        item3.Children.Add(child3);

        _items = new[] {item1, item2, item3};
        tv.DataContext = _items;
    }

        private void CalculateExpandedClick(object sender, RoutedEventArgs e)
        {
            var expanded = 0;
            foreach (TreeViewItemViewModel item in _items)
            {
                expanded += GetNumberOfExpanded(item);
            }
            ExpandedNumber.Text = expanded.ToString();
        }

    private int GetNumberOfExpanded(TreeViewItemViewModel model)
    {
        var expandedCount = 0;
        if (model.IsExpanded)
        {
            expandedCount += 1;
            foreach (TreeViewItemViewModel child in model.Children)
            {
                expandedCount += GetNumberOfExpanded(child);
            }
        }
        return expandedCount;
    }
  }

    /// <summary>
    /// Single tree view item view model.
    /// </summary>
    public class TreeViewItemViewModel : INotifyPropertyChanged
    {
        public ObservableCollection<TreeViewItemViewModel> Children
        {
            get; private set;
        }

        private bool _isExpanded;
        private string _text;

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

        public string Text
        {
            get { return _text; }
            set
            {
                _text = value;
                OnPropertyChanged("Text");
            }
        }

        public TreeViewItemViewModel()
        {
            Children = new ObservableCollection<TreeViewItemViewModel>();
            Text = DateTime.Now.ToLongTimeString(); // Just fake data.
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string name)
        {
            var changed = PropertyChanged;
            if (changed != null)
            {
                changed(this, new PropertyChangedEventArgs(name));
            }
        }
    }
}

<强> XAML

<Window x:Class="WpfApplication1.TestBrowser"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Expanded Test"
        Height="300"
        Width="300">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <TreeView x:Name="tv"
              ItemsSource="{Binding}">
            <TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}">
                    <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
                </Style>
            </TreeView.ItemContainerStyle>
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                    <TextBlock Text="{Binding Text}" />
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

        <StackPanel Grid.Column="1">
            <Button Content="Get number of expanded items" 
                            Click="CalculateExpandedClick"/>
            <TextBlock x:Name="ExpandedNumber" />
        </StackPanel>
    </Grid>
</Window>

希望这有帮助。

相关问题