2009-11-25 15 views
45

En WPF Binding.Mode, al seleccionar Default, depende de la propiedad que se encuaderna.¿Cuáles son los valores predeterminados para Binding.Mode = Default para los controles de WPF?

Estoy buscando alguna lista o alguna convención o información sobre los valores predeterminados para los diversos controles.
Es decir, qué propiedades son TwoWay de manera predeterminada y así sucesivamente. ¡Todos los enlaces, ideas, pensamientos e incluso discursos son bienvenidos!

Respuesta

48

similares a UpdateSourceTrigger, el valor predeterminado de la propiedad Modo varía para cada propiedad. Las propiedades de usuario editables como TextBox.Text, ComboBox.Text, MenuItem.IsChecked, etc, tienen TwoWay como su valor de modo predeterminado. Para ver si el valor predeterminado es TwoWay, consulte la sección Información de la propiedad de dependencia de la propiedad. Si dice BindsTwoWayByDefault se establece en verdadero, , entonces el valor de modo predeterminado de la propiedad es TwoWay. Para hacerlo mediante programación, obtener los metadatos propiedad de la propiedad llamando GetMetadata y luego comprobar el valor booleano de la propiedad BindsTwoWayByDefault .

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

La forma más segura sería estar siempre explícita qué tipo de modo de unión que quiere de una unión.

+2

¿Hay algún lugar donde pueda encontrar una lista de todas las propiedades y sus valores predeterminados de BindingMode? ¿cuales son las normas? – Shimmy

+0

La lista de propiedades es interminable. Supongo que http://msdn.microsoft.com enumera la mayoría de los de Microsoft. No veo ninguna información y el modo de enlace allí, así que supongo que tendrías que averiguarlo por ti mismo. La URL que di en mi respuesta explica cómo encontrarlos –

+3

¿Qué sucede con las propiedades de dependencia cuyos metadatos son UIPropertyMetadata en lugar de FrameworkPropertyMetadata? Los documentos de MSDN para tales propiedades no mencionan BindsTwoWayByDefault ya que ese booleano no existe en UIPropertyMetadata. – HappyNomad

8

Aquí está una manera de encontrar el modo por defecto con el apoyo de un DP -

.NET Reflector es su amigo. Con el reflector, busque TextBox y mire la fuente para el constructor estático (.cctor()). Aquí, será capaz de encontrar el código utilizado para registrar la 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 
        ) 
       ); 

aviso de que un parámetro se pasa al método de registro que indique el modo por defecto Encuadernación: FrameworkPropertyMetadataOptions.BindsTwoWayByDefault. Si usa el reflector para mirar el registro de TextBlock's Text DP, usted verá que no se pasa tal valor, en cuyo caso asumimos que el enlace es de una sola manera por defecto.

Tomado de post de Bea Stollnitz: How can I update an explicit binding within a template?

A pesar de tener algún tipo de lista de instrucciones importantes de DP sería muy útil.

0

Estaba buscando una lista también, sobre todo para averiguar qué enlaces se pueden establecer en una sola dirección para mejorar el rendimiento.Las siguientes funciones pueden ayudar a encontrar la que controla el uso de dos vías de enlace por defecto:

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

Utilizando 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 la muestra (propiedades de control de dos vías vinculante por 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 dos vías de unión.

Cuestiones relacionadas