.net - WPF控件的Binding.Mode=Default的默認值是什麼?




dependency-properties binding-mode (2)

在WPF Binding.Mode ,選擇Default ,它取決於綁定的屬性。

我正在尋找一些列表或一些約定或任何信息的各種控件的默認值。
我的意思是,默認情況下TwoWay的屬性是什麼等等。 任何鏈接,想法,想法,甚至咆哮都很受歡迎!


與UpdateSourceTrigger類似,Mode屬性的默認值因每個屬性而異。 用戶可編輯的屬性(如TextBox.TextComboBox.TextMenuItem.IsChecked等)將TwoWay作為其默認的Mode值。 要確定默認值是否為TwoWay ,請查看屬性的“依賴項屬性信息”部分。 如果它將BindsTwoWayByDefault設置為true,則屬性的默認Mode值為TwoWay 。 要以編程方式執行此操作,請通過調用GetMetadata獲取屬性的屬性元數據,然後檢查BindsTwoWayByDefault屬性的布爾值。

資料來源: http://blogs.msdn.com/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspxhttp://blogs.msdn.com/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

最安全的方法是始終明確您希望從綁定中獲得什麼樣的綁定模式。


正在尋找一個列表,主要是為了找出哪些綁定可以設置為單向以提高性能。 以下函數可以幫助您找到默認情況下使用雙向綁定的控件:

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屬性,它具有雙向綁定。





binding-mode