2009-11-25 12 views
45

Dans WPF Binding.Mode, lorsque vous sélectionnez Default, cela dépend de la propriété liée.Quelles sont les valeurs par défaut pour Binding.Mode = Par défaut pour les contrôles WPF?

Je cherche une liste ou une convention ou toute information pour les paramètres par défaut pour les différents contrôles.
Je veux dire, quelles propriétés sont TwoWay par défaut et ainsi de suite. Tous les liens, idées, pensées et même les diatribes sont bien accueillis!

Répondre

48

similaires à UpdateSourceTrigger, la valeur par défaut pour la propriété Mode varie pour chaque propriété. propriétés modifiables par l'utilisateur tels que TextBox.Text, ComboBox.Text, MenuItem.IsChecked, etc, ont TwoWay leur valeur Mode par défaut. Pour figure si la valeur par défaut est TwoWay, regardez la section Informations sur la propriété de dépendance de la propriété. Si elle indique BindsTwoWayByDefault est défini sur true, , la valeur Mode par défaut de la propriété est TwoWay. Pour ce faire programme, obtenir la propriété métadonnées de la propriété en appelant GetMetadata puis vérifiez la valeur booléenne de la propriété BindsTwoWayByDefault .

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

La meilleure façon serait d'être toujours explicite ce genre de mode de liaison que vous voulez à partir d'une fixation.

+2

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

+0

La liste des propriétés est infinie. Je suppose que http://msdn.microsoft.com liste la plupart de ceux de Microsoft. Je ne vois aucune information et le mode de liaison là-bas, donc je suppose que vous auriez à le découvrir par vous-même. L'url que j'ai donné dans ma réponse explique comment les trouver –

+3

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 pour ces propriétés ne mentionnent pas BindsTwoWayByDefault car ce booléen n'existe pas sur UIPropertyMetadata. – HappyNomad

8

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

NET Reflector est votre ami. Avec le réflecteur, recherchez TextBox et recherchez la source du constructeur statique (.cctor()). Ici, vous pourrez trouver le code utilisé pour l'enregistrement du 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 transmis à la méthode registre indiquant la liaison par défaut Mode: FrameworkPropertyMetadataOptions.BindsTwoWayByDefault. Si vous utilisez le réflecteur pour regarder l'enregistrement du TextDon DP de TextBlock, vous verrez qu'une telle valeur n'est pas passée, auquel cas nous supposons que la liaison est unidirectionnelle par défaut.

Tiré du poste de Bea Stollnitz: How can I update an explicit binding within a template?

Bien qu'ayant une sorte de liste des importants PDD serait très utile.

0

Je cherchais également une liste, principalement pour savoir quelles liaisons pouvaient être réglées sur un sens pour améliorer les performances.Les fonctions suivantes peuvent vous aider à trouver qui contrôle utiliser deux voies de liaison 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; 
} 

l'aide d'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 deux voies la liaison 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 deux voies de liaison.

Questions connexes