Bonjour à tous,
J'ai besoin de pouvoir sélectionner plusieurs éléments en même temps dans une treeview (par exemple, avec ctrl appuyé). J'ai trouvé le code suivant qui marche très bien (je l'ai testé séparément).
Code C# : 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 private static readonly PropertyInfo IsSelectionChangeActiveProperty = typeof(TreeView).GetProperty ( "IsSelectionChangeActive", BindingFlags.NonPublic | BindingFlags.Instance ); public static void AllowMultiSelection(TreeView treeView) { if (IsSelectionChangeActiveProperty == null) return; var selectedItems = new List<TreeViewItem>(); treeView.SelectedItemChanged += (a, b) => { var treeViewItem = treeView.SelectedItem as TreeViewItem; if (treeViewItem == null) return; // allow multiple selection // when control key is pressed if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) { // suppress selection change notification // select all selected items // then restore selection change notifications var isSelectionChangeActive = IsSelectionChangeActiveProperty.GetValue(treeView, null); IsSelectionChangeActiveProperty.SetValue(treeView, true, null); selectedItems.ForEach(item => item.IsSelected = true); IsSelectionChangeActiveProperty.SetValue ( treeView, isSelectionChangeActive, null ); } else { // deselect all selected items except the current one selectedItems.ForEach(item => item.IsSelected = (item == treeViewItem)); selectedItems.Clear(); } if (!selectedItems.Contains(treeViewItem)) { selectedItems.Add(treeViewItem); } else { // deselect if already selected treeViewItem.IsSelected = false; selectedItems.Remove(treeViewItem); } }; }
Cependant, dans mon application, ma treeview ne contient pas des treeview item mais est bindée sur une classe perso :
Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <TreeView Name="TreeViewSelectedData" ItemsSource="{Binding SelectedData}" DockPanel.Dock="Right"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding ChildItems}"> <TextBlock Text="{Binding Display}" Margin="0 3" FontStyle="{Binding FontStyle}" /> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView>
Et par conséquent, le code ci-dessus ne marche pas. Lorsque je remplace TreeViewItem par ma classe perso, il me dit très logiquement que ma classe perso ne contient pas l'attribut "isSelected".
Comment puis-je faire ?
Partager