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


Dans WPF Binding.Mode, lors de la sélection Défaut, cela dépend de la propriété liée.

Je recherche une liste ou une convention ou des informations sur les valeurs par défaut pour les différents contrôles.
Je veux dire, quelles sont les propriétés TwoWay par défaut et ainsi de suite. Tous les liens, les idées, les pensées et même les encouragements sont les bienvenus!


50
2017-11-25 14:04


origine


Réponses:


Similaire à UpdateSourceTrigger, le   valeur par défaut pour la propriété Mode   varie pour chaque propriété.   Propriétés modifiables par l'utilisateur telles que    TextBox.Text, ComboBox.Text,    MenuItem.IsChecked, etc, ont TwoWay   comme valeur de mode par défaut. Pour figurer   out si le défaut est TwoWay, Regarder   les informations de propriété de dépendance   section de la propriété. Si ça dit    BindsTwoWayByDefault est défini sur true,   puis la valeur par défaut du mode du   la propriété est TwoWay. Pour le faire   par programmation, obtenir la propriété   métadonnées de la propriété en appelant    GetMetadata puis vérifiez le booléen   valeur du BindsTwoWayByDefault   propriété.

La source: http://blogs.msdn.com/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

Le moyen le plus sûr serait de toujours préciser le type de mode de liaison que vous souhaitez pour une liaison.


56
2017-11-25 14:14



Voici un moyen de trouver le mode par défaut pris en charge par un DP -

.NET Reflector est votre ami. Avec réflecteur, recherchez TextBox et   regardez la source du constructeur statique (.cctor()). Ici vous   sera en mesure de trouver le code utilisé pour enregistrer le 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
                   )
                );

Notez qu'un paramètre est passé à la méthode Register indiquant   le mode de reliure par défaut:    FrameworkPropertyMetadataOptions.BindsTwoWayByDefault. Si tu utilises   réflecteur à regarder l'enregistrement pour TextBlock Text DP, vous   verra que cette valeur n'est pas passée, auquel cas nous supposons la   la liaison est un moyen par défaut.

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

Bien qu’avoir une sorte de liste d’importants PDD serait très utile.


9
2018-04-24 07:27



Je cherchais également une liste, principalement pour savoir quelles liaisons pouvaient être paramétrées pour améliorer les performances. Les fonctions suivantes peuvent vous aider à trouver les commandes 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, nous donne 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

Fait intéressant, la plupart des contrôles ont une propriété TextSearch qui a une liaison bidirectionnelle.


1
2017-11-21 16:36