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