Quali sono le impostazioni predefinite per Binding.Mode = default per i controlli WPF?
-
22-09-2019 - |
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!
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, hannoTwoWay
come il loro valore di default Mezzo. Capire se il valore predefinito èTwoWay
, guarda la dipendenza Informazioni generali sezione della proprietà. Se si diceBindsTwoWayByDefault
è impostata su true, allora il valore di default della modalità proprietà èTwoWay
. Per farlo a livello di codice, ottenere la proprietà metadati della proprietà chiamandoGetMetadata
e quindi controllare il booleano valore dellaBindsTwoWayByDefault
Proprietà.
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 delTextProperty
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.