Binding.Mode = WPF控件的默认值是什么?

在WPF Binding.Mode ,当selectDefault时 ,它依赖于绑定的属性。

我正在寻找一些列表或一些约定或任何信息的默认为各种控制。
我的意思是,默认情况下TwoWay哪些属性等等。 任何链接,想法,想法,甚至是咆哮都很好!

与UpdateSourceTrigger类似,Mode属性的默认值对于每个属性都不相同。 用户可编辑的属性(如TextBox.TextComboBox.TextMenuItem.IsChecked等)具有TwoWay作为其默认的Mode值。 要确定默认值是否为TwoWay ,请查看属性的“依赖项属性信息”部分。 如果它说BindsTwoWayByDefault设置为true,那么该属性的默认Mode值是TwoWay 。 要以编程方式执行,请通过调用GetMetadata获取属性的属性元数据,然后检查BindsTwoWayByDefault属性的布尔值。

资料来源: http : //blogs.msdn.com/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

最安全的方法是始终明确从绑定中想要什么样的绑定模式。

这是findDP支持的默认模式的一种方法 –

.NETreflection器是你的朋友。 使用reflection器,searchTextBox并查看静态构造函数( .cctor() )的源代码。 在这里,您将能够find用于注册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 ) ); 

请注意,parameter passing给Register方法,指示默认绑定模式: FrameworkPropertyMetadataOptions.BindsTwoWayByDefault 。 如果您使用reflection器来查看TextBlock的Text DP的注册,您将看到没有这样的值被传递,在这种情况下,我们假设绑定是默认的一种方式。

来自Bea Stollnitz的文章: 如何更新模板中的显式绑定?

虽然有一些重要的DP列表将是非常有帮助的。

也在寻找一个列表,主要是为了找出哪些绑定可以设置为单向来提高性能。 以下function可以帮助您find哪些控件默认使用双向绑定:

 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; } 

使用打印function,给我们一个清单:

 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属性。