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

时间:2009-11-25 14:04:16

标签: .net wpf binding dependency-properties binding-mode

在WPF Binding.Mode中,选择Default时,它取决于要绑定的属性。

我正在寻找一些列表或某些约定或任何有关各种控件的默认值的信息 我的意思是,默认情况下属性为TwoWay,依此类推。 任何链接,想法,想法甚至咆哮都很受欢迎!

3 个答案:

答案 0 :(得分:66)

  

类似于UpdateSourceTrigger,   Mode属性的默认值   每个房产都有所不同。   用户可编辑的属性,例如   TextBox.TextComboBox.Text,   MenuItem.IsCheckedTwoWay   作为默认的Mode值。想一想   如果默认值为TwoWay,请查看   依赖属性信息   财产的一部分。如果它说   BindsTwoWayByDefault设置为true,   然后是默认的Mode值   属性是TwoWay。去做吧   以编程方式获取财产   通过调用属性的元数据   GetMetadata然后检查布尔值   BindsTwoWayByDefault的价值   属性。

来源:https://web.archive.org/web/20100209025938/http://blogs.msdn.com/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

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

答案 1 :(得分:10)

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

  

.NET Reflector是你的朋友。使用反射器,搜索TextBox和   查看静态构造函数的源代码(.cctor())。在这里,你   将能够找到用于注册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
                   )
                );
     

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

取自Bea Stollnitz的帖子:How can I update an explicit binding within a template?

虽然拥有某种重要的DP列表会非常有帮助。

答案 2 :(得分:3)

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

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属性,它具有双向绑定。