Domanda

In WPF Binding.Mode , quando si seleziona default , dipende nella proprietà di essere rilegato.

Cerco qualche lista o qualche convegno o qualsiasi informazione per le impostazioni predefinite per i vari controlli.
Voglio dire, che le proprietà sono TwoWay per impostazione predefinita e così via. Qualsiasi link, idee, pensieri e anche le invettive sono ospitava!

È stato utile?

Soluzione

  

Simile a UpdateSourceTrigger, il   valore predefinito per la proprietà Mode   varia per ogni proprietà.   proprietà modificabile dall'utente, come   TextBox.Text, ComboBox.Text,   MenuItem.IsChecked, ecc, hanno TwoWay   come il loro valore di default Mezzo. Capire   se il valore predefinito è TwoWay, guarda   la dipendenza Informazioni generali   sezione della proprietà. Se si dice   BindsTwoWayByDefault è impostata su true,   allora il valore di default della modalità   proprietà è TwoWay. Per farlo   a livello di codice, ottenere la proprietà   metadati della proprietà chiamando   GetMetadata e quindi controllare il booleano   valore della BindsTwoWayByDefault   Proprietà.

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

Il modo più sicuro sarebbe quello di essere sempre esplicito che tipo di modalità di rilegatura che si desidera da un binding.

Altri suggerimenti

Ecco un modo per trovare la modalità predefinita supportata da un DP -

  

.NET Reflector è tuo amico. Con riflettore, cercare TextBox e   guardare il sorgente per il costruttore statico (.cctor()). Qui,   sarà in grado di trovare il codice utilizzato per la registrazione del 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
                   )
                );
     

Si noti che un parametro viene passato al metodo Register indica   il default Binding Mode:   FrameworkPropertyMetadataOptions.BindsTwoWayByDefault. Se si utilizza   riflettore a guardare la registrazione per TextBlock di testo DP,   vedrà che tale valore è passato, nel qual caso si suppone che il   vincolanti è un modo per impostazione predefinita.

Tratto da post di Bea Stollnitz: Come posso aggiornare un esplicito legame all'interno di un modello

Pur avendo un qualche tipo di elenco di importanti DP di sarebbe molto utile.

era alla ricerca di un elenco così, per lo più per scoprire quali attacchi potrebbero essere impostati a un modo per migliorare le prestazioni. Le seguenti funzioni possono trovare che controlla utilizzare due vie vincolante per impostazione predefinita:

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

Utilizzo di una funzione di stampa, ci dà un elenco:

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

Esempio risultato (proprietà di controllo con due vie di legame come difetto)

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

È interessante notare che la maggior parte dei controlli hanno una proprietà che ha TextSearch legame a doppio senso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top