【问题标题】:What are the defaults for Binding.Mode=Default for WPF controls?WPF 控件的 Binding.Mode=Default 的默认值是什么?
【发布时间】:2010-12-20 07:20:43
【问题描述】:

在wpf Binding.Mode,在选择Default时,它取决于属性绑定。

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

【问题讨论】:

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


    【解决方案1】:

    类似于 UpdateSourceTrigger, Mode 属性的默认值 因每个属性而异。 用户可编辑的属性,例如 TextBox.Text, ComboBox.Text, MenuItem.IsChecked等,有TwoWay 作为它们的默认模式值。想办法 如果默认为TwoWay,请查看 依赖属性信息 财产的一部分。如果它说 BindsTwoWayByDefault 设置为真, 然后是默认模式值 属性是TwoWay。去做吧 以编程方式,获取属性 通过调用属性的元数据 GetMetadata 然后检查布尔值 BindsTwoWayByDefault 的值 属性。

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

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

    【讨论】:

    • 有没有一个地方可以找到所有属性及其 BindingMode 默认值的列表?规则是什么?
    • 属性列表是无穷无尽的。我猜msdn.microsoft.com 列出了大多数来自微软的。我没有看到任何信息和绑定模式,所以我想你必须自己找出来。我在回答中给出的网址解释了如何找到它们
    • 元数据是 UIPropertyMetadata 而不是 FrameworkPropertyMetadata 的依赖属性呢?此类属性的 MSDN 文档未提及 BindsTwoWayByDefault,因为 UIPropertyMetadata 上不存在该布尔值。
    • 不是列表,但默认情况下使用双向绑定的属性在Dependency Property Information 段中提到了这一点。在Metadata properties set to true 行中有一个BindsTwoWayByDefault 条目。
    【解决方案2】:

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

    .NET Reflector 是你的朋友。使用反射器,搜索TextBox 和 查看静态构造函数的源代码 (.cctor())。在这里,你 将能够找到用于注册TextProperty 的代码 摄影指导:

    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 列表会很有帮助。

    【讨论】:

    【解决方案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 属性,该属性具有双向绑定。

    【讨论】:

      猜你喜欢
      • 2011-08-21
      • 1970-01-01
      • 2020-03-24
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多