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!

Foi útil?

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, tem TwoWaycomo 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 diz BindsTwoWayByDefault 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 ligando GetMetadata e então verifique o valor booleano do BindsTwoWayByDefaultpropriedade.

Fonte: https://web.archive.org/web/20100209025938/http://blogs.msdn.com/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

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 o TextPropertyDP:

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top