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


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

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

3 51

3 ответа:

подобно UpdateSourceTrigger, значение по умолчанию для свойства режим варьируется для каждого свойства. Редактируемые свойства, такие как 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

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

вот способ найти режим по умолчанию, поддерживаемый 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
                   )
                );

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

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

хотя наличие какого-то списка важных 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, которое имеет двустороннюю привязку.