Я просто пытаюсь найти способ управлять разворачиванием / сворачиванием узлов TreeView через объект, к которому они привязаны. У объекта есть свойство IsExpanded, и я хочу использовать его, чтобы показать сам узел TreeView, развернутый или свернутый в зависимости от этого свойства.

Вот мой код:

C #:

public partial class Window2 : Window
{
    public Window2()
    {
        InitializeComponent();

        this.DataContext = new List<Parent>() { Base.GetParent("Parent 1"), Base.GetParent("Parent 2") };
    }
}

public class Base
{
    public string Name { get; set; }
    public bool IsExpanded { get; set; }

    public static Parent GetParent(string name)
    {
        Parent p = new Parent() { Name = name };

        p.Children.Add(new Child() { Name = "Child 1", GrandChildren = new ObservableCollection<GrandChild>() { new GrandChild() { Name = "Grandchild 1" } } });
        p.Children.Add(new Child() { Name = "Child 2", GrandChildren = new ObservableCollection<GrandChild>() { new GrandChild() { Name = "Grandchild 1" } } });
        p.Children.Add(new Child() { Name = "Child 3", GrandChildren = new ObservableCollection<GrandChild>() { new GrandChild() { Name = "Grandchild 1" } } });

        return p;
    }
}

public class Parent : Base
{
    public ObservableCollection<Child> Children { get; set; }

    public Parent()
    {
        this.Children = new ObservableCollection<Child>();
    }
}

public class Child : Base
{
    public ObservableCollection<GrandChild> GrandChildren { get; set; }

    public Child()
    {
        this.GrandChildren = new ObservableCollection<GrandChild>();
    }
}

public class GrandChild : Base
{
}

XAML:

<Window x:Class="HeterogeneousExperimentExplorer.Window2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:HeterogeneousTree"
    Title="Window2" Height="300" Width="300">
    <Window.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:Parent}" ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Name}" />
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate DataType="{x:Type local:Parent}" ItemsSource="{Binding GrandChildren}">
                    <TextBlock Text="{Binding Name}" />
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Name}" />
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </Window.Resources>
    <Grid>
        <TreeView ItemsSource="{Binding}" />
    </Grid>
</Window>
22
Carlo 11 Ноя 2009 в 22:55

2 ответа

Лучший ответ

Придумал решение. Действительно просто:

    <Style TargetType="{x:Type TreeViewItem}">
        <Setter Property="IsExpanded" Value="{Binding IsNodeExpanded}">
        </Setter>
    </Style>

Таким образом, стиль связывает объект с TreeViewItem, смотрит на его атрибут IsNodeExpanded и присваивает это значение свойству TreeViewItem.IsExpanded. Если вы добавите Mode = TwoWay, они будут уведомлять друг друга (TreeViewItem сообщит объекту, когда он был развернут).

Благодарность!

51
Carlo 11 Ноя 2009 в 23:36
1
Это примерно поздно (9 лет спустя) - но где в XML вы поместили элемент Style?
 – 
NirMH
31 Окт 2018 в 15:18
2
Он должен быть в TreeView.Resources
 – 
Krzysztof Skowronek
14 Ноя 2018 в 14:43
4
И не забудьте поставить Mode=TwoWays для полной функциональности
 – 
Krzysztof Skowronek
14 Ноя 2018 в 15:18
1
Также полезная ссылка stackoverflow.com/questions/1487144/autoexpand-treeview-in -wpf
 – 
Sergey Orlov
26 Окт 2020 в 20:26

FWIW, вас может заинтересовать эта статья CodeProject Джоша Смита, в которой показано, как для создания древовидного представления на основе MVVM с использованием универсального (n-уровневого) подхода.

Я не утверждаю, что с реализацией Карло что-то не так, но я нашел эту статью полезной для понимания элемента управления TreeView и MVVM в целом.

1
si618 9 Сен 2010 в 12:14