What are the defaults for Binding.Mode=Default for WPF controls?
.NetWpfBindingDependency PropertiesBinding Mode.Net Problem Overview
In WPF Binding.Mode
, when selecting Default, it depends in the property being binded.
I am looking for some list or some convention or any information for the defaults for the various controls.
I mean, what properties are TwoWay
by default and so on.
Any links, ideas, thoughts and even rants are welcommed!
.Net Solutions
Solution 1 - .Net
> Similar to UpdateSourceTrigger, the
> default value for the Mode property
> varies for each property.
> User-editable properties such as
> TextBox.Text
, ComboBox.Text
,
> MenuItem.IsChecked
, etc, have TwoWay
> as their default Mode value. To figure
> out if the default is TwoWay
, look at
> the Dependency Property Information
> section of the property. If it says
> BindsTwoWayByDefault
is set to true,
> then the default Mode value of the
> property is TwoWay
. To do it
> programmatically, get the property
> metadata of the property by calling
> GetMetadata
and then check the boolean
> value of the BindsTwoWayByDefault
> property.
The safest way would be to always be explicit what kind of binding mode you want from a binding.
Solution 2 - .Net
Here's a way to find the Default mode supported by a DP -
> .NET Reflector is your friend. With reflector, search for TextBox
and
> look at the source for the static constructor (.cctor()
). Here, you
> will be able to find the code used for registering the 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
> )
> );
>
> Notice that a parameter is passed to the Register method indicating
> the default Binding Mode:
> FrameworkPropertyMetadataOptions.BindsTwoWayByDefault
. If you use
> reflector to look at the registration for TextBlock’s Text DP, you
> will see that no such value is passed, in which case we assume the
> binding is one way by default.
Taken from Bea Stollnitz's post : How can I update an explicit binding within a template?
Although having some kind of list of important DP's would be very helpful.
Solution 3 - .Net
Was looking for a list as well, mostly to find out which bindings could be set to one-way to improve performance. The following functions can help you find which controls use two-way binding by default:
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;
}
Using a print function, gives us a list:
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}");
}
}
Sample result (control properties with two-way binding as default)
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
Interestingly, most controls have a TextSearch property which has two-way binding.