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);
}
}
}