60 votes

Quelles sont les valeurs par défaut de Binding.Mode=Default pour les contrôles WPF ?

Dans WPF Binding.Mode en sélectionnant Défaut Cela dépend de la propriété qui est liée.

Je cherche une liste, une convention ou toute autre information sur les valeurs par défaut des différents contrôles.
Je veux dire, quelles sont les propriétés TwoWay par défaut et ainsi de suite. Tout lien, toute idée, toute réflexion et même tout commentaire sont les bienvenus !

74voto

Lars Truijens Points 24005

Comme pour le déclencheur UpdateSourceTrigger, la fonction valeur par défaut de la propriété Mode varie pour chaque propriété. Les propriétés modifiables par l'utilisateur, telles que TextBox.Text , ComboBox.Text , MenuItem.IsChecked etc, ont TwoWay comme valeur par défaut du mode. Pour savoir si la valeur par défaut est TwoWay regardez l'information sur la propriété de dépendance de la propriété. S'il est indiqué BindsTwoWayByDefault est défini comme vrai, alors la valeur Mode par défaut de la propriété est TwoWay . Pour le faire de manière programmatique, récupérez la propriété de la propriété en appelant GetMetadata et ensuite vérifier le booléen de la BindsTwoWayByDefault propriété.

Source : https://web.archive.org/web/20100209025938/http://blogs.msdn.com/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

Le moyen le plus sûr serait de toujours être explicite quant au type de mode de liaison que vous souhaitez pour une liaison.

2 votes

Existe-t-il un endroit où je peux trouver une liste de toutes les propriétés et de leurs BindingMode par défaut ? Quelles sont les règles ?

0 votes

La liste des propriétés est sans fin. Je suppose msdn.microsoft.com liste la plupart de ceux de Microsoft. Je ne vois pas d'informations sur le mode de liaison, donc je suppose que vous devrez le découvrir par vous-même. L'URL que j'ai donné dans ma réponse explique comment les trouver.

3 votes

Qu'en est-il des propriétés de dépendance dont les métadonnées sont UIPropertyMetadata plutôt que FrameworkPropertyMetadata ? Les documents MSDN relatifs à ces propriétés ne mentionnent pas BindsTwoWayByDefault, car ce booléen n'existe pas dans UIPropertyMetadata.

10voto

akjoshi Points 6711

Voici un moyen de trouver le mode par défaut supporté par un DP -.

.NET Reflector est votre ami. Avec Reflector, recherchez TextBox et regardez la source du constructeur statique ( .cctor() ). Ici, vous pourrez trouver le code utilisé pour l'enregistrement de la TextProperty DP :

TextProperty = DependencyProperty.Register
               (
                   "Text", 
                   typeof(string), 
                   typeof(TextBox), 
                   new FrameworkPropertyMetadata
                   (
                      string.Empty, 
                      FrameworkPropertyMetadataOptions.Journal |
                      FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 
                      new PropertyChangedCallback(TextBox.OnTextPropertyChanged), 
                      new CoerceValueCallback(TextBox.CoerceText), 
                      true, 
                      UpdateSourceTrigger.LostFocus
                   )
                );

Remarquez qu'un paramètre est passé à la méthode Register indiquant le mode de liaison par défaut : FrameworkPropertyMetadataOptions.BindsTwoWayByDefault . Si vous utilisez réflecteur pour regarder l'enregistrement du DP Text du TextBlock, vous vous verrez qu'aucune valeur de ce type n'est transmise, auquel cas nous supposons que le est unidirectionnelle par défaut.

Tiré du message de Bea Stollnitz : Comment mettre à jour une liaison explicite dans un modèle ?

Bien qu'il serait très utile d'avoir une sorte de liste des PD importants.

1 votes

Il est également facile de consulter la source de référence : referencesource.microsoft.com/#PresentationFramework/src/

3voto

Freek Sanders Points 647

Je cherchais aussi une liste, surtout pour savoir quelles fixations pouvaient être réglées en sens unique pour améliorer les performances. Les fonctions suivantes peuvent vous aider à trouver les contrôles qui utilisent une liaison bidirectionnelle par défaut :

public IList<DependencyProperty> GetAttachedProperties(DependencyObject obj)
{
    var result = new List<DependencyProperty>();
    foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(obj, new Attribute[] { new PropertyFilterAttribute(PropertyFilterOptions.Valid) }))
    {
        var dpd = DependencyPropertyDescriptor.FromProperty(pd);
        if (dpd != null)
        {
            result.Add(dpd.DependencyProperty);
        }
    }
    return result;
}

public bool IsBindsTwoWayByDefault(DependencyObject obj, DependencyProperty property)
{
    var metadata = property.GetMetadata(obj) as FrameworkPropertyMetadata;
    if (metadata != null)
    {
        return metadata.BindsTwoWayByDefault;
    }
    return false;
}

En utilisant une fonction d'impression, on obtient une liste :

var objList = new List<DependencyObject> { new TextBox(), new TextBlock(), new Label(), new ComboBox(), new Button() };
foreach (var obj in objList)
{
    var props = GetAttachedProperties(obj);
    foreach (var prop in props)
    {
        if(IsBindsTwoWayByDefault(obj, prop))
            Debug.WriteLine($"{obj} : {prop.OwnerType}:{prop.Name}");
    }
}

Exemple de résultat (propriétés de contrôle avec liaison bidirectionnelle par défaut)

System.Windows.Controls.TextBox : System.Windows.Controls.TextBox:Text
System.Windows.Controls.TextBox : System.Windows.Controls.TextSearch:Text
System.Windows.Controls.TextBlock : System.Windows.Controls.TextSearch:Text
System.Windows.Controls.Label : System.Windows.Controls.TextSearch:Text
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.ComboBox:IsDropDownOpen
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.ComboBox:Text
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.Primitives.Selector:SelectedIndex
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.Primitives.Selector:SelectedItem
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.Primitives.Selector:SelectedValue
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.TextSearch:Text
System.Windows.Controls.Button : System.Windows.Controls.TextSearch:Text

Il est intéressant de noter que la plupart des contrôles ont une propriété TextSearch qui a une liaison bidirectionnelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X