Binding.Mode = WPF控件的默认值是什么?
在WPF Binding.Mode
,当selectDefault时 ,它依赖于绑定的属性。
我正在寻找一些列表或一些约定或任何信息的默认为各种控制。
我的意思是,默认情况下TwoWay
哪些属性等等。 任何链接,想法,想法,甚至是咆哮都很好!
与UpdateSourceTrigger类似,Mode属性的默认值对于每个属性都不相同。 用户可编辑的属性(如
TextBox.Text
,ComboBox.Text
,MenuItem.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器,search
TextBox
并查看静态构造函数(.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属性。