سؤال

أنا فقط أحاول أن أجد وسيلة للسيطرة على توسيع / انهيار 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>
هل كانت مفيدة؟

المحلول

جاء مع الحل.حقا بسيطة:

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

وبالتالي فإن نمط يحصل الكائن بد أن TreeViewItem وتبدو في IsNodeExpanded السمة و هذا يعين أن قيمة TreeViewItem.IsExpanded الملكية.إذا قمت بإضافة Mode=TwoWay ، فإنها سوف يخطر بعضها البعض (TreeViewItem سوف اقول الكائن عندما تم توسيع).

وذلك بفضل!

نصائح أخرى

FWIW, كنت قد تكون مهتمة في هذا CodeProject المادة من قبل جوش سميث مما يدل على كيفية إنشاء MVVM على أساس عرض شجرة استخدام عام (n-مستوى) النهج.

أنا لا أقترح هناك أي شيء خاطئ مع كارلو التنفيذ ، ولكن وجدت هذه المادة مفيدة في فهم عنصر تحكم TreeView ، MVVM بشكل عام.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top