Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
анимешник++
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
1

TreeView не видит "детей"

02.08.2013, 14:28. Показов 1225. Ответов 6

Author24 — интернет-сервис помощи студентам
Есть класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class TreeEntry
    {
        private Node _parent;
        private UInt32 _count;
        private ObservableCollection<TreeEntry> _childs;
 
        public Node Parent { get { return _parent; } set { _parent = value; } }
        public UInt32 Count { get { return _count; } set { _count = value; } }
        public ObservableCollection<TreeEntry> Childs { get { return _childs; } set { _childs = value; } }
        public TreeEntry() {}
        public TreeEntry(Node parent, UInt32 count = 1)
        {
            Parent = parent;
            Count = count;
            Childs = new ObservableCollection<TreeEntry>();
        }
        public override string ToString()
        {
            return Parent.ToString();
        }
    }
Я заполняю его рекурсивно и в итоге получаю 1 родительский элемент, у которого в поле _childs есть множество дочерних.
Есть TreeView (Tree), которому я выставляю программно ItemsSource на этот полученный элемент. Дело в том, что выводится только родительский элемент, а все дочерние игнорируются. Скажите, что нужно еще выставить в свойствах (не через XAML).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.08.2013, 14:28
Ответы с готовыми решениями:

WPF TreeView не видит списки
есть TreeView на него биндится список экземпляров некоторого класса A. public class A{ public...

Определить предикат дети и найти всех детей и детей конкретного лица
Определить предикат дети и найти всех детей и детей конкретного лица. в среде Prolog.

WD3200AAJB-00J3A0 то НЕ видит, то видит BIOS, USB-to-IDE/SATA видит всегда
День добрый. Есть HDD WD3200AAJB-00J3A0. Проблема в том, что его перестал видеть BIOS. Иногда...

BIOS видит HDD. Windows, Acronis не видит. Live UBUNTU видит
Нужно вытащить данные с неисправного жесткого диска. HDD 2.5&quot; Toshiba 160 Gb Sata. BIOS видит...

Как присвоить серверному контроллу TreeView коллекцию из TreeView, в котором находится информация из БД
Здравствуйте, в общем я кидаю на страницу TreeView и хочу его динамически заполнять, но сразу куча...

6
430 / 431 / 93
Регистрация: 16.07.2012
Сообщений: 886
02.08.2013, 15:58 2
Без шаблона вам тут не обойтись:
XML
1
2
3
<HierarchicalDataTemplate DataType="{x:Type local:TreeEntry}" ItemsSource="{Binding Childs}">
    <TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>
Шаблон без XAML трудновато будет создать
1
анимешник++
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
02.08.2013, 19:15  [ТС] 3
Я раньше не работал с шаблонами, не подскажете, где их требуется размещать? Я так понял, что это не компонент TreeView.
К тому же, родительский элемент я получаю в функции и там же и настраиваю.
Приблизительно так:
C#
1
2
3
4
5
6
7
8
private void RadButton_Click_1(object sender, RoutedEventArgs e)
        {
            Tree.Items.Clear();
            foreach (ListEntry l in List.Items)
            {
                Tree.Items.Add(l.node.Craft(l.Count));
            }
        }
В принципе, можно и отдельно формировать список, каждый раз его переопределяя. И класс TreeEntry у меня находится в дочернем namespace, это как-то влияет на XAML?
0
430 / 431 / 93
Регистрация: 16.07.2012
Сообщений: 886
02.08.2013, 19:35 4
У вас в проекте есть файлы App.xaml или там Window1.xaml? Шаблон можно добавить, например, в секцию Resources этих файлов:
XML
1
2
3
4
5
6
7
8
9
10
11
<Application x:Class="WpfApplication1.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1.Namespace1"
    StartupUri="Window1.xaml">
    <Application.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:TreeEntry}" ItemsSource="{Binding Childs}">
            <TextBlock Text="{Binding}"/>
        </HierarchicalDataTemplate>
    </Application.Resources>
</Application>
(Предполагается что TreeEntry находится в WpfApplication1.Namespace1)
1
анимешник++
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
02.08.2013, 19:37  [ТС] 5
Спасибо, я заменил local на logic и это вроде помогло. Сейчас найду как применить шаблон к данному объекту, надеюсь будет все нормально.
0
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
02.08.2013, 19:51 6
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System.Collections.ObjectModel;
using System.Data;
using System.Windows;
 
namespace ComboBoxTest
{
    public class Node
    {
        public string Col1 { get; set; }
        public string Col2 { get; set; }
        public ObservableCollection<Node> Chield { get; set; }
 
        public Node()
        {
            Chield = new ObservableCollection<Node>();
        }
    }
 
    public partial class MainWindow : Window
    {
        public static ObservableCollection<Node> Collection { get; set; }
        static MainWindow()
        {
            Collection = new ObservableCollection<Node>() {
                new Node() { Col1 = "123", Col2 = "dsda",
                    Chield = new ObservableCollection<Node>()
                    {
                        new Node() { Col1 = "kljl", Col2 = "asdasr" },
                        new Node() { Col1 = "kljl", Col2 = "asdasr" },
                        new Node() { Col1 = "kljl", Col2 = "asdasr" },
                        new Node() { Col1 = "kljl", Col2 = "asdasr" },
                    }
                },
                new Node() { Col1 = "123", Col2 = "dsda", 
                    Chield = new ObservableCollection<Node>()
                    {
                        new Node() { Col1 = "kljl", Col2 = "asdasr" },
                        new Node() { Col1 = "kljl", Col2 = "asdasr" },
                        new Node() { Col1 = "kljl", Col2 = "asdasr" },
                        new Node() { Col1 = "kljl", Col2 = "asdasr" },
                    }
                },
                new Node() { Col1 = "123", Col2 = "dsda",
                    Chield = new ObservableCollection<Node>()
                    {
                        new Node() { Col1 = "kljl", Col2 = "asdasr" },
                        new Node() { Col1 = "kljl", Col2 = "asdasr" },
                        new Node() { Col1 = "kljl", Col2 = "asdasr" },
                        new Node() { Col1 = "kljl", Col2 = "asdasr" },
                    },
                }
            };
        }
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<Window x:Class="ComboBoxTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ComboBoxTest"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <CollectionViewSource x:Key="tree"  Source="{Binding Source={x:Static local:MainWindow.Collection}}" />
    </Window.Resources>
    <Grid>
        <TreeView ItemsSource="{Binding}" DataContext="{Binding Source={StaticResource tree}}">
            <TreeView.ItemContainerStyle>
                <Style TargetType="TreeViewItem">
                    <Setter Property="IsExpanded" Value="True"/>
                </Style>
            </TreeView.ItemContainerStyle>
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Chield}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Col1}" Width="100"/>                        
                        <TextBlock Text="{Binding Col2}"/>
                    </StackPanel>
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding Col1}" Width="100"/>
                                <TextBlock Text="{Binding Col2}"/>
                            </StackPanel>
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </Grid>
</Window>
1
анимешник++
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
02.08.2013, 19:56  [ТС] 7
Я уже нашел применение шаблону. Все работает отлично.

Не подскажете, где еще можно почитать про шаблоны и TreeView?
Меня интересует возможность выводить текст форматированно (возможно, разными цветами: у меня в 1м элементе идет имя и количество) и также меня интересует возможность пройти по всем "развернутым" веткам, и когда я найду некую "не разворачиваемую ветвь" (Childs.Count == 0) или "не развернутую ветвь" (Childs.Count != 0 и IsExpanded == false к примеру), то собрать их в новый список.
0
02.08.2013, 19:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2013, 19:56
Помогаю со студенческими работами здесь

Найти совпадающий текст в TreeView и показать найденные результаты открыть нужную ветку в TreeView
Найти совпадающий текст в TreeView и показать найденные результаты открыть нужную ветку в TreeView...

Вывод результата запроса в treeView - Заполнить курсами первый уровень treeView, а тестами второй
Здравствуйте, помогите, пожалуйста, у меня есть список курсов и список тестов (каждый из которых...

HDD-видит BIOS, видит диспетчер устройст, но не видит система
Ну что же, вечер добрый товарищи. Возникла такая проблема, описываю все по-порядку. -Купил...

Перетаскивание из treeview первой формы в другой treeview второй формы
Добрый день! Есть небольшая проблема при написании кода фильтрации того, что можно перетянуть в...

трое детей
Добрый вечер) помогите пожалуйста решить задачу! В семье трое детей. Тоне вдвое больше лет, чем...

Количество детей
В этой задаче вы можете использовать одномерные массивы (или их аналоги), циклы и операторы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru