Каковы значения по умолчанию для Binding.Mode = По умолчанию для элементов управления WPF?
В WPF Binding.Mode
при выборе Default, это зависит от привязки свойства.
Я ищу список или какое-либо соглашение или любую информацию по умолчанию для различных элементов управления.
Я имею в виду, какие свойства TwoWay
по умолчанию и т.д.
Любые ссылки, идеи, мысли и даже уговоры приветствуются!
Ответы
Ответ 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()
). Вот ты сможет найти код, используемый для регистрации TextProperty
DP:
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, которое имеет двустороннюю привязку.