valor tag predeterminado otro celda campo basado .net wpf binding dependency-properties binding-mode

.net - tag - ¿Cuáles son los valores predeterminados para Binding.Mode=predeterminado para los controles WPF?



valor predeterminado access (3)

Al igual que en UpdateSourceTrigger, el valor predeterminado para la propiedad Modo varía para cada propiedad. Las propiedades editables por el usuario, como TextBox.Text , ComboBox.Text , MenuItem.IsChecked , etc., tienen TwoWay como su valor de Modo predeterminado. Para averiguar si el valor predeterminado es TwoWay , consulte la sección Información de propiedad de dependencia de la propiedad. Si dice que BindsTwoWayByDefault está establecido en true, entonces el valor de Modo predeterminado de la propiedad es TwoWay . Para hacerlo mediante programación, obtenga los metadatos de propiedad de la propiedad llamando a GetMetadata y luego verifique 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 siempre ser explícito qué tipo de modo de enlace desea de un enlace.

En WPF Binding.Mode , al seleccionar Default , depende de la propiedad que se está enlazando.

Estoy buscando alguna lista o alguna convención o cualquier información para los valores predeterminados de los distintos controles.
Quiero decir, qué propiedades son TwoWay por defecto y así sucesivamente. Todos los enlaces, ideas, pensamientos e incluso rants son bienvenidos!


Aquí hay una manera de encontrar el modo predeterminado admitido por un DP:

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

Observe que se pasa un parámetro al método de registro que indica el modo de enlace predeterminado: FrameworkPropertyMetadataOptions.BindsTwoWayByDefault . Si usa el reflector para ver el registro de TextBlock''s Text DP, verá que no se pasa dicho valor, en cuyo caso asumimos que el enlace es de una manera predeterminada.

Tomado de la publicación de Bea Stollnitz: ¿Cómo puedo actualizar un enlace explícito dentro de una plantilla?

Aunque tener algún tipo de lista de PD importantes sería muy útil.


También estaba buscando una lista, principalmente para averiguar qué enlaces podrían establecerse en una forma para mejorar el rendimiento. Las siguientes funciones pueden ayudarlo a encontrar qué controles utilizan enlaces de dos vías de forma predeterminada:

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

Usando 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 enlace bidireccional como predeterminado)

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 enlace bidireccional.