¿Cuáles son los valores predeterminados para Binding.Mode = por defecto para los controles de WPF?
-
22-09-2019 - |
Pregunta
Binding.Mode
, al seleccionar por defecto , que depende de la propiedad que se enganchan.
Busco a alguna lista o alguna convención o cualquier información de los valores predeterminados para los distintos controles.
Es decir, qué propiedades son TwoWay
por defecto y así sucesivamente.
Cualquier enlace, ideas, pensamientos y diatribas incluso se welcommed!
Solución
Al igual que en UpdateSourceTrigger, la valor predeterminado de la propiedad Modo varía para cada propiedad. Las propiedades de usuario-editable tales como
TextBox.Text
,ComboBox.Text
,MenuItem.IsChecked
, etc, tienenTwoWay
como su valor de modo predeterminado. la figura si el defecto esTwoWay
, ver la Dependencia Información del hotel sección de la propiedad. Si diceBindsTwoWayByDefault
se establece en true, entonces el valor por defecto del Modo propiedad esTwoWay
. Para hacerlo programación, obtener la propiedad metadatos de la propiedad llamandoGetMetadata
y después comprobar el booleano valor de laBindsTwoWayByDefault
propiedad.
La forma más segura sería estar siempre explícita qué tipo de modo de unión que quiere de una unión.
Otros consejos
Esta es una manera de encontrar el modo por defecto con el apoyo de un DP -
.NET Reflector es su amigo. Con reflector, buscar y
TextBox
mirar a la fuente para el constructor estático (.cctor()
). Tu aquí será capaz de encontrar el código utilizado para registrar laTextProperty
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 ) );
Tenga en cuenta que un parámetro se pasa al método de registro que indique el modo de unión por defecto:
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault
. Si utiliza reflector para mirar el registro para el texto de TextBlock DP se veremos que pasa hay tal valor, en cuyo caso se asume la unión es una forma predeterminada.
Tomado del puesto de Bea Stollnitz: ¿Cómo puedo actualizar una unión explícita dentro de una plantilla
A pesar de tener algún tipo de lista de instrucciones importantes de DP sería muy útil.
Estaba buscando una lista así, sobre todo para saber qué fijaciones podrían fijarse a una sola vía para mejorar el rendimiento. Las siguientes funciones pueden ayudarle a encontrar lo que controles usan vinculante por defecto de dos vías:
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;
}
El uso de una función de impresión, nos da una lista:
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}");
}
}
Resultado de Muestra (propiedades de control con dos vías de unión como defecto)
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
Curiosamente, la mayoría de los controles tienen una propiedad TextSearch que tiene la unión de dos vías.