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

.net WPF控件的Binding.Mode=Default的默认值是什么?,.net,wpf,binding,dependency-properties,binding-mode,.net,Wpf,Binding,Dependency Properties,Binding Mode,在WPF中,选择时取决于要绑定的属性 我正在寻找各种控件的默认值的一些列表或约定或任何信息。 我的意思是,默认情况下什么属性是双向的等等。 欢迎任何链接、想法、想法甚至咆哮 与UpdateSourceTrigger类似 模式属性的默认值 每种属性都不同。 用户可编辑的属性,例如 TextBox.Text,ComboBox.Text, MenuItem.IsChecked等,具有双向 作为其默认模式值。算出 如果默认值为双向,请查看 依赖项属性信息 财产的一部分。如果它说 默认情况下,bindst

在WPF中,选择时取决于要绑定的属性

我正在寻找各种控件的默认值的一些列表或约定或任何信息。
我的意思是,默认情况下什么属性是双向的等等。 欢迎任何链接、想法、想法甚至咆哮

与UpdateSourceTrigger类似 模式属性的默认值 每种属性都不同。 用户可编辑的属性,例如
TextBox.Text
ComboBox.Text
MenuItem.IsChecked
等,具有双向

作为其默认模式值。算出
如果默认值为双向
,请查看 依赖项属性信息 财产的一部分。如果它说 默认情况下,
bindstwoway
设置为true, 然后是 属性是双向的。去做 以编程方式获取属性 通过调用
GetMetadata
,然后检查布尔值 默认情况下,
bindstwoway的值
财产

资料来源:


最安全的方法是始终明确您希望从绑定中获得什么样的绑定模式。

下面是一种查找DP支持的默认模式的方法-

.NET Reflector是您的朋友。使用reflector,搜索
文本框
,然后 查看静态构造函数的源代码(
.cctor()
)。给你 将能够找到用于注册
TextProperty
DP:

请注意,一个参数被传递到Register方法,表示 默认绑定模式: 默认情况下,
FrameworkPropertyMetadataOptions.bindstwoway
。如果你使用 要查看TextBlock的文本DP的注册,请执行以下操作: 将看到没有传递这样的值,在这种情况下,我们假设 默认情况下,绑定是一种方式

摘自Bea Stollnitz的帖子:


虽然有一些重要DP的列表会很有帮助。

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

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

有趣的是,大多数控件都有一个具有双向绑定的TextSearch属性。

有没有一个地方可以找到所有属性及其绑定模式默认值的列表?规则是什么?财产清单是无穷无尽的。我想大部分都是微软的。我没有看到任何信息和绑定模式,所以我想你必须自己去发现。我在回答中给出的url解释了如何查找元数据为UIPropertyMetadata而不是FrameworkPropertyMetadata的依赖项属性呢?默认情况下,此类属性的MSDN文档没有提到BindsTwoWayBy,因为UIPropertyMetadata上不存在该布尔值。不是列表,但默认情况下使用双向绑定的属性在
依赖项属性信息
段中提到了这一点。默认情况下,
元数据属性设置为true的行中有一个
bindstwoway
条目。查找参考源也很容易:
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