Quais são os padrões para Binding.Mode=Default para controles WPF?
-
22-09-2019 - |
Pergunta
No WPF Binding.Mode
, ao selecionar Padrão, depende da propriedade que está sendo vinculada.
Estou procurando alguma lista ou convenção ou qualquer informação sobre os padrões dos vários controles.
Quero dizer, quais propriedades são TwoWay
por padrão e assim por diante.Quaisquer links, ideias, pensamentos e até reclamações são bem-vindos!
Solução
Semelhante ao UpdateRourCetRigger, o valor padrão da propriedade Mode varia para cada propriedade.Propriedades editáveis pelo usuário, como
TextBox.Text
,ComboBox.Text
,MenuItem.IsChecked
, etc, temTwoWay
como seu valor de modo padrão.Para descobrir se o padrão éTwoWay
, observe a seção de informações da propriedade de dependência da propriedade.Se dizBindsTwoWayByDefault
está definido como true, então o valor do modo padrão da propriedade éTwoWay
.Para fazer isso programaticamente, obtenha os metadados da propriedade da propriedade ligandoGetMetadata
e então verifique o valor booleano doBindsTwoWayByDefault
propriedade.
A maneira mais segura seria sempre deixar explícito que tipo de modo de ligação você deseja de uma ligação.
Outras dicas
Aqui está uma maneira de encontrar o modo padrão suportado por um dp -
.NET Reflector é seu amigo. Com o refletor, procure por
TextBox
e observe a fonte do construtor estático (.cctor()
). Aqui, você poderá encontrar o código usado para registrar oTextProperty
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 um parâmetro é passado para o método de registro, indicando o modo de ligação padrão:
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault
. Se você usar o Reflector para examinar o registro para o texto do texto do TextBlock, verá que nenhum valor é aprovado; nesse caso, assumimos que a ligação é uma maneira por padrão.
Retirado da postagem de Bea Stollnitz: Como posso atualizar uma ligação explícita em um modelo?
Embora ter algum tipo de lista de PDs importantes seja muito útil.
Estava procurando uma lista também, principalmente para descobrir quais ligações poderiam ser definidas para melhorar o desempenho. As funções a seguir podem ajudá-lo a descobrir quais controles usam a ligação bidirecional por padrão:
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 uma função de impressão, nos fornece uma 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 da amostra (propriedades de controle com ligação bidirecional como padrão)
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, a maioria dos controles possui uma propriedade TextSearch que possui ligação bidirecional.