Каковы значения по умолчанию для Binding.Mode=Default для элементов управления WPF?

StackOverflow https://stackoverflow.com/questions/1797105

Вопрос

В WPF Binding.Mode, при выборе По умолчанию, это зависит от привязываемого свойства.

Я ищу какой-то список, какое-то соглашение или любую информацию о значениях по умолчанию для различных элементов управления.
Я имею в виду, какие свойства TwoWay по умолчанию и так далее.Любые ссылки, идеи, мысли и даже напыщенные речи приветствуются!

Это было полезно?

Решение

Подобно Updatesourcetrigger, значение по умолчанию для свойства Mode варьируется для каждого свойства.Редактируемые пользователем свойства, такие как TextBox.Text, ComboBox.Text, MenuItem.IsChecked, и т. д., есть TwoWayв качестве значения режима по умолчанию.Выяснить, является ли по умолчанию TwoWay, посмотрите на раздел информации о собственности в зависимости.Если там написано BindsTwoWayByDefault устанавливается на TRUE, тогда значение режима по умолчанию свойства TwoWay.Чтобы сделать это программно, получите метаданные недвижимости имущества, позвонив GetMetadata а затем проверьте логическое значение BindsTwoWayByDefaultсвойство.

Источник: https://web.archive.org/web/20100209025938/http://blogs.msdn.com/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

Самый безопасный способ — всегда четко указывать, какой режим привязки вы хотите от привязки.

Другие советы

Вот способ найти режим по умолчанию, поддерживаемый DP:

.NET Reflector — ваш друг.С отражателем найдите TextBox и посмотрите на источник статического конструктора (.cctor()).Здесь вы сможете найти код, используемый для регистрации TextPropertyДП:

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

Обратите внимание, что параметр передается методу регистра, указывающему режим привязки по умолчанию: FrameworkPropertyMetadataOptions.BindsTwoWayByDefault.Если вы используете отражатель, чтобы посмотреть на регистрацию для TextBlock DP, вы увидите, что такого значения не передается, и в этом случае мы предполагаем, что привязка является одним из способов по умолчанию.

Взято из поста Беа Стольниц: Как я могу обновить явную привязку в шаблоне?

Хотя иметь какой-то список важных DP было бы очень полезно.

Также искал список, в основном для того, чтобы выяснить, какие привязки можно установить в одностороннем режиме для повышения производительности.Следующие функции помогут вам определить, какие элементы управления используют двустороннюю привязку по умолчанию:

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

Использование функции печати дает нам список:

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

Пример результата (свойства элемента управления с двусторонней привязкой по умолчанию)

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

Интересно, что большинство элементов управления имеют свойство TextSearch, имеющее двустороннюю привязку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top