Bonjour,
comme dit dans le titre, je cherche à ajouter la propriété IsSynchronizedWithCurrentItem à un contrôle TreeView.
J'ai développé un TreeView sur lequel j'ai bindé plusieurs collections d'objets différentes. J'ai par exemple, une ObservableCollection<Outil>, une ObservableCollection<Machine>, etc.
Mon but est que l'élément sélectionné dans le treeview (sous réserve que celui-ci fasse parti d'une des listes bindées) soit mis comme objet courant de la CollectionView associée. Ainsi, le détail de l'élément sélectionné est automatiquement affiché dans une vue "Détail".
Je me suis appuyé sur un code trouvé sur le net.
Ce code utilise une attached property appelé IsSynchronizedWithCurrentItem en référence à la propriété de même nom de la classe Selector. L'idée est que cette attached property fonctionne dans un premier temps avec un treeview mais si possible avec d'autres contrôles.
Le principe est d'utiliser l'évènement SelectedItemChanged.
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 public class SelectorExtension { static List<Control> _selectors = new List<Control>(); public static readonly DependencyProperty IsSynchronizedWithCurrentItemProperty = DependencyProperty.RegisterAttached("IsSynchronizedWithCurrentItem", typeof(bool), typeof(SelectorExtension), new FrameworkPropertyMetadata(false, (s, e) => { var control = s as TreeView; if (control == null) { return; } if ((bool)e.NewValue) { control.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(control_SelectedItemChanged); _selectors.Add(control); } else { if (_selectors.Contains(control)) { _selectors.Remove(control); } } })); public static void SetIsSynchronizedWithCurrentItem(UIElement element, Boolean value) { element.SetValue(IsSynchronizedWithCurrentItemProperty, value); } public static Boolean GetIsSynchronizedWithCurrentItem(UIElement element) { return (Boolean)element.GetValue(IsSynchronizedWithCurrentItemProperty); } static void control_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) { // Code }
Ainsi j'ai à ma disposition:
- la propriété Treeview.SelectedItem qui retourne l'objet "métier" sélectionné si celui-ci fait bien parti de l'une des collections bindé au TreeView, sinon elle retourne un TreeViewItem.
- l'élément courant peut être défini avec la méthode CollectionView.MoveCurrentTo(Object item).
Selon moi, il faut que je trouve le moyen de récupérer la CollectionView de la collection dont fait parti l'objet récupéré avec la propriété TreeView.SelectedItem, et je ne sais pas trop comment faire.
Bref, je m'y perds un peu et j'aurais besoin de votre aide.
Auriez-vous une idée pour que je puisse résoudre ma problématique ?
Merci d'avance,
Zoax
Partager