Подтвердить что ты не робот

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

В WPF Binding.Mode при выборе Default, это зависит от привязки свойства.

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Здесь можно найти режим по умолчанию, поддерживаемый DP -

.NET Reflector - ваш друг. С рефлектором найдите TextBox и посмотрите на источник статического конструктора (.cctor()). Вот ты сможет найти код, используемый для регистрации 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
                   )
                );

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

Взято из сообщения Bea Stollnitz: Как я могу обновить явное связывание в шаблоне?

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

Ответ 3

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

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, которое имеет двустороннюю привязку.