using System.Windows; using System.Windows.Controls; namespace Developpez.Dotnet.Windows.Behaviors { /// /// Fournit des propriétés attachées pour ajouter des fonctionnalités au contrôle TreeView /// public static class TreeViewBehavior { /// /// Identifie la propriété attachée TrackSelectedItem /// public static readonly DependencyProperty TrackSelectedItemProperty = DependencyProperty.RegisterAttached( "TrackSelectedItem", typeof(bool), typeof(TreeViewBehavior), new UIPropertyMetadata( false, TrackSelectedItemChanged)); /// /// Identifie la propriété attachée Selecteditem /// public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.RegisterAttached( "SelectedItem", typeof(object), typeof(TreeViewBehavior), new FrameworkPropertyMetadata( null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, SelectedItemChanged)); /// /// Identifie la propriété attachée IsSelectedPath /// public static readonly DependencyProperty IsSelectedPathProperty = DependencyProperty.RegisterAttached( "IsSelectedPath", typeof(string), typeof(TreeViewBehavior), new UIPropertyMetadata(null)); /// /// Obtient la valeur de la propriété attachée TrackSelectedItem pour l'objet spécifié /// /// L'objet pour lequel obtenir la valeur de la propriété /// Une valeur indiquant si le suivi de l'élément sélectionné du TreeView est actif [AttachedPropertyBrowsableForType(typeof(TreeView))] public static bool GetTrackSelectedItem(TreeView obj) { return (bool)obj.GetValue(TrackSelectedItemProperty); } /// /// Définit la valeur de la propriété attachée TrackSelectedItem pour l'objet spécifié /// /// L'objet pour lequel définir la valeur de la propriété /// True pour activer le suivi de l'élément sélectionné du TreeView, sinon false public static void SetTrackSelectedItem(TreeView obj, bool value) { obj.SetValue(TrackSelectedItemProperty, value); } /// /// Obtient la valeur de la propriété attachée SelectedItem pour l'objet spécifié /// /// L'objet pour lequel obtenir la valeur de la propriété /// L'élément sélectionné du TreeView [AttachedPropertyBrowsableForType(typeof(TreeView))] public static object GetSelectedItem(TreeView obj) { return obj.GetValue(SelectedItemProperty); } /// /// Définit la valeur de la propriété attachée SelectedItem pour l'objet spécifié /// /// L'objet pour lequel définir la valeur de la propriété /// L'élément à sélectionner dans le TreeView public static void SetSelectedItem(TreeView obj, object value) { obj.SetValue(SelectedItemProperty, value); } /// /// Obtient la valeur de la propriété attachée IsSelectedPath pour l'objet spécifié /// /// L'objet pour lequel obtenir la valeur de la propriété /// Le chemin de la propriété des éléments indiquant si l'élément est sélectionné [AttachedPropertyBrowsableForType(typeof(TreeView))] public static string GetIsSelectedPath(TreeView obj) { return (string)obj.GetValue(IsSelectedPathProperty); } /// /// Définit la valeur de la propriété attachée IsSelectedPath pour l'objet spécifié /// /// L'objet pour lequel définir la valeur de la propriété /// Le chemin de la propriété des éléments indiquant si l'élément est sélectionné public static void SetIsSelectedPath(TreeView obj, string value) { obj.SetValue(IsSelectedPathProperty, value); } private static void TrackSelectedItemChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) { TreeView treeView = o as TreeView; if (treeView == null) return; var oldValue = (bool)e.OldValue; var newValue = (bool)e.NewValue; if (oldValue && !newValue) { treeView.SelectedItemChanged -= treeView_SelectedItemChanged; } else if (newValue && !oldValue) { treeView.SelectedItemChanged += treeView_SelectedItemChanged; } } private static void SelectedItemChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) { TreeView treeView = o as TreeView; if (treeView == null) return; if (treeView.SelectedItem == e.NewValue) return; string path = GetIsSelectedPath(treeView); if (path == null) return; if (e.NewValue == null) { if (e.OldValue != null) { PropertyPathHelper.SetValue(e.OldValue, path, false); } return; } PropertyPathHelper.SetValue(e.NewValue, path, true); } private static void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e) { TreeView treeView = sender as TreeView; if (treeView == null) return; SetSelectedItem(treeView, e.NewValue); } } }