Каковы значения по умолчанию для Binding.Mode=Default для элементов управления WPF?
-
22-09-2019 - |
Вопрос
В WPF Binding.Mode
, при выборе По умолчанию, это зависит от привязываемого свойства.
Я ищу какой-то список, какое-то соглашение или любую информацию о значениях по умолчанию для различных элементов управления.
Я имею в виду, какие свойства TwoWay
по умолчанию и так далее.Любые ссылки, идеи, мысли и даже напыщенные речи приветствуются!
Решение
Подобно Updatesourcetrigger, значение по умолчанию для свойства Mode варьируется для каждого свойства.Редактируемые пользователем свойства, такие как
TextBox.Text
,ComboBox.Text
,MenuItem.IsChecked
, и т. д., естьTwoWay
в качестве значения режима по умолчанию.Выяснить, является ли по умолчаниюTwoWay
, посмотрите на раздел информации о собственности в зависимости.Если там написаноBindsTwoWayByDefault
устанавливается на TRUE, тогда значение режима по умолчанию свойстваTwoWay
.Чтобы сделать это программно, получите метаданные недвижимости имущества, позвонивGetMetadata
а затем проверьте логическое значениеBindsTwoWayByDefault
свойство.
Самый безопасный способ — всегда четко указывать, какой режим привязки вы хотите от привязки.
Другие советы
Вот способ найти режим по умолчанию, поддерживаемый 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, имеющее двустороннюю привязку.