Bonjour à tous,
j'essaye depuis quelques semaines maintenant de réaliser un treeview efficace, mais je rencontre encore quelques problèmes... voici mon code:
le treeview XAML (1 racine, 1 niveau sans checkbox, 2 niveau avec checkbox):
les objets sur lequel il est bindé (dsl pour le pavé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 <ScrollViewer> <DockPanel Height="400"> <DockPanel.Resources> <local:ListCat x:Key="MyList"/> <HierarchicalDataTemplate DataType="{x:Type local:Cat}" ItemsSource="{Binding Path=LstSsCat}"> <TextBlock Text="{Binding Path=Name}"/> </HierarchicalDataTemplate> <HierarchicalDataTemplate DataType="{x:Type local:SsCat}" ItemsSource="{Binding Path=LstProcess}"> <CheckBox IsChecked="{Binding Path=IsCheck}" Content="{Binding Path=Name}" /> </HierarchicalDataTemplate> <DataTemplate DataType="{x:Type tsk:SyncProcessUnit}"> <CheckBox Content="{Binding Path=Name}" IsChecked="{Binding Path=Active}" /> </DataTemplate> </DockPanel.Resources> <TreeView Name="trvTasks"> <TreeViewItem ItemsSource="{Binding Source={StaticResource MyList}}" /> </TreeView> </DockPanel> </ScrollViewer>):
pas besoin de tout lire, la chose importante ici est la propriété IsCheck des Sous Catégories.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120 /// <summary> /// classe de binding pour les catégories de 1er niveau /// </summary> class Cat { /// <summary> /// nom /// </summary> public string Name { get; set; } /// <summary> /// liste des sous-catégories /// </summary> public List<SsCat> LstSsCat { get; set; } public Cat(string _name) { Name = _name; LstSsCat = new List<SsCat>(); } } /// <summary> /// liste des catégories de 2ème niveau /// </summary> class SsCat { /// <summary> /// détermine si l'intégralité des processus de la catégorie est sélectionnée /// </summary> private bool isCheck; /// <summary> /// nom de la sous-catégorie /// </summary> public string Name { get; set; } /// <summary> /// liste des processus de la catégorie /// </summary> public List<SyncProcessUnit> LstProcess { get; set; } /// <summary> /// accesseur sur isCheck /// </summary> public bool IsCheck { get { return isCheck; } set { isCheck = value; if (isCheck) { foreach (SyncProcessUnit p in LstProcess) { if (!p.Active) p.Active = true; } } } } public SsCat(bool _check, string _name) { Name = _name; LstProcess = new List<SyncProcessUnit>(); isCheck = _check; } /// <summary> /// recherche les processus actifs du groupe et valorise IsCheck si ils le sont tous /// </summary> public void SetActivation() { bool action = true; if (LstProcess.Count > 0) { foreach (SyncProcessUnit p in LstProcess) { if (!p.Active) action = false; } } else action = false; isCheck = action; } } /// <summary> /// classe de binding pour le TreeView /// </summary> class ListCat : List<Cat> { public ListCat() { foreach (SyncProcess prc in syncProcessManager.GetInstance()) { SyncProcess.SyncProcessGroup grp = (SyncProcess.SyncProcessGroup)prc; if (grp.IsRoot) { int i = 0; foreach (SyncProcess prc4 in grp.Processus) { SyncProcess.SyncProcessGroup grp3 = (SyncProcess.SyncProcessGroup)prc4; this.Add(new Cat(grp3.Name)); int j = 0; foreach (SyncProcess prc2 in grp3.Processus) { SyncProcess.SyncProcessGroup grp2 = (SyncProcess.SyncProcessGroup)prc2; this[i].LstSsCat.Add(new SsCat(false, grp2.Name)); foreach (SyncProcess prc3 in grp2.Processus) { SyncProcessUnit prc3Unit = (SyncProcessUnit)prc3; this[i].LstSsCat[j].LstProcess.Add(prc3Unit); } this[i].LstSsCat[j].SetActivation(); j++; } i++; } } } } }
Quand l'utilisateur coche une checkbox du niveau supérieur, tout les enfants voit leur propriété IsCheck passée également à True.
Normalement comme la propriété IsCheck de chaque enfant est bindé sur leur checkbox respective, celles-ci devraient être instantanément cochées, malheureusement rien ne se produit graphiquement...
je ne sais pas si j'ai été clairje peux préciser si besoin...
Merci!
Partager