在WPF中 Binding.Mode, ,选择时 默认, ,这取决于所绑定的属性。

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

有帮助吗?

解决方案

与UpdatesUrCetrigger类似,模式属性的默认值各不相同。用户可编辑的属性,例如 TextBox.Text, ComboBox.Text, MenuItem.IsChecked, 等,有 TwoWay作为它们的默认模式值。弄清楚默认值是 TwoWay, ,查看属性的依赖属性信息部分。如果它说 BindsTwoWayByDefault 设置为true,然后属性的默认模式值为 TwoWay. 。要通过编程进行操作,请致电获取财产的属性元数据 GetMetadata 然后检查布尔值 BindsTwoWayByDefault财产。

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

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

其他提示

下面是找到一个DP支持的默认模式的方式 -

  

.net反射是你的朋友。随着反射器,搜索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
                   )
                );
     

请注意,一个参数传递给注册方法指示   默认绑定模式:   FrameworkPropertyMetadataOptions.BindsTwoWayByDefault。如果您使用   反射器看登记的TextBlock的文本DP,你   可以看到,没有这样的值传递,在这种情况下,我们假设   结合是通过默认的一种方式。

从比亚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;
}

使用打印功能,为我们提供了一个清单:

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

有趣的是,大多数控件有具有双向绑定一个文本搜索属性。

scroll top