using System; using System.Windows; using System.Windows.Data; using System.Windows.Markup; namespace Developpez.Dotnet.Windows.Markup { /// /// Obtient le GroupName pour la portée courante (définie par la propriété attachée IsGroupNameScope) /// /// /// Cette classe permet de définir des portées locales pour les noms de groupe de RadioButton, de façon à éviter les conflits de noms. /// Les objets appartenant à une portée locale peuvent obtenir le nom de groupe local via la markup extension GroupName. Par exemple : /// /// /// /// /// /// ]]> /// /// Pour utiliser plusieurs groupes dans une même portée, précisez un nom local qui sera combiné au nom de base de la portée : /// /// /// /// /// /// /// /// ]]> /// /// Dans l'exemple ci-dessus, les animaux et les fruits appartiennent à des groupes distincts, et ne sont donc pas mutuallement exclusifs. /// [MarkupExtensionReturnType(typeof(string))] public class GroupName : MultiBinding { /// /// Initialise une nouvelle instance de la classe GroupName /// public GroupName() : this(null) { } /// /// Initialise une nouvelle instance de la classe GroupName /// /// Nom local du groupe, qui sera combiné avec le nom de base pour la portée locale. public GroupName(string localName) { this.LocalName = localName; Bindings.Add(new Binding { Path = new PropertyPath(BaseNameProperty), RelativeSource = RelativeSource.Self }); Bindings.Add(new Binding { Path = new PropertyPath("LocalName"), Source = this }); StringFormat = "{0}/{1}"; } /// /// Nom local pour ce GroupName, qui sera combiné avec le nom de base pour la portée locale /// [ConstructorArgument("localName")] public string LocalName { get; set; } /// /// Obtient la valeur de la propriété IsGroupNameScope pour l'objet spécifié /// /// Objet pour lequel obtenir la valeur de la propriété /// true si cet objet définit une portée locale pour le GroupName, sinon false public static bool GetIsGroupNameScope(DependencyObject obj) { return (bool)obj.GetValue(IsGroupNameScopeProperty); } /// /// Définit la valeur de la propriété IsGroupNameScope pour l'objet spécifié /// /// Objet pour lequel définir la valeur de la propriété /// true pour définir une portée locale pour le GroupName pour cet objet et ses descendants, sinon false public static void SetIsGroupNameScope(DependencyObject obj, bool value) { obj.SetValue(IsGroupNameScopeProperty, value); } /// /// Identifiant de la propriété attachée IsGroupNameScope /// public static readonly DependencyProperty IsGroupNameScopeProperty = DependencyProperty.RegisterAttached( "IsGroupNameScope", typeof(bool), typeof(GroupName), new UIPropertyMetadata( false, OnIsGroupNameScopeChanged)); /// /// Obtient la valeur de la propriété attachée BaseName pour l'objet spécifié /// /// Objet pour lequel obtenir la valeur de la propriété /// Le nom du GroupName pour la portée locale, ou null si l'objet n'appartient pas à une portée locale public static string GetBaseName(DependencyObject obj) { return (string)obj.GetValue(BaseNameProperty); } private static void SetBaseName(DependencyObject obj, string value) { obj.SetValue(_baseNamePropertyKey, value); } private static readonly DependencyPropertyKey _baseNamePropertyKey = DependencyProperty.RegisterAttachedReadOnly( "BaseName", typeof(string), typeof(GroupName), new FrameworkPropertyMetadata( null, FrameworkPropertyMetadataOptions.Inherits)); /// /// Identifiant de la propriété attachée BaseName. /// public static readonly DependencyProperty BaseNameProperty = _baseNamePropertyKey.DependencyProperty; private static void OnIsGroupNameScopeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { bool newValue = (bool) e.NewValue; if (newValue) SetBaseName(d, Guid.NewGuid().ToString()); else SetBaseName(d, null); } } }