Древовидное представление WPF DataBound развернуть/свернуть

StackOverflow https://stackoverflow.com/questions/1717654

Вопрос

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

Вот мой код:

С#:

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
{
}

КСАМЛ:

<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>
Это было полезно?

Решение

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

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

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

Спасибо!

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top