在WPF Binding.Mode中,当选择Default时,它取决于正在绑定的属性。
我正在寻找一些列表或一些约定或各种控件的默认值的任何信息。
我的意思是,哪些属性在默认情况下是TwoWay等等。任何链接,想法,想法,甚至是咆哮都是值得欢迎的!
发布于 2009-11-25 22:14:44
与UpdateSourceTrigger类似,
属性的默认值因每个属性而异。用户可编辑的属性(如
TextBox.Text、ComboBox.Text、MenuItem.IsChecked等)的默认Mode值为TwoWay。要确定默认值是否为TwoWay,请查看该属性的依赖项属性信息部分。如果它显示BindsTwoWayByDefault设置为true,则该属性的默认Mode值为TwoWay。要以编程方式完成此操作,请通过调用GetMetadata获取属性的属性元数据,然后检查BindsTwoWayByDefault属性的布尔值。
最安全的方法是始终明确地说明您希望从绑定中使用哪种绑定模式。
发布于 2012-04-24 15:27:27
以下是一种查找DP支持的默认模式的方法-
.NET反射器是你的朋友。使用reflector,搜索
TextBox并查看静态构造函数(.cctor())的源代码。在这里,您将能够找到用于注册TextPropertyDP的代码:
TextProperty = DependencyProperty.Register ( "Text",typeof(string),typeof(TextBox),new FrameworkPropertyMetadata ( string.Empty,FrameworkPropertyMetadataOptions.Journal |Textnew PropertyChangedCallback(TextBox.OnTextPropertyChanged),CoerceValueCallback(TextBox.CoerceText),true,UpdateSourceTrigger.LostFocus ) );
注意,一个参数被传递给Register方法,指示默认的绑定模式:FrameworkPropertyMetadataOptions.BindsTwoWayByDefault。如果您使用reflector查看TextBlock的文本DP的注册,您将看到没有这样的值被传递,在这种情况下,我们假设绑定是默认的单向绑定。
摘自Bea Stollnitz的帖子:How can I update an explicit binding within a template?
尽管有一些重要的DP列表会很有帮助。
发布于 2017-11-22 00:36:27
我也在寻找一个列表,主要是为了找出哪些绑定可以设置为单向,以提高性能。以下函数可以帮助您了解哪些控件默认使用双向绑定:
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属性。
https://stackoverflow.com/questions/1797105
复制相似问题