在WPF Binding.Mode
中,當選擇Default時,它取決於綁定的屬性。對於WPF控件,Binding.Mode = Default的默認值是什麼?
我正在尋找一些列表或一些約定或任何信息的各種控制的默認值。
我的意思是,什麼屬性默認爲TwoWay
等等。 任何鏈接,想法,想法,甚至咆哮都很好!
在WPF Binding.Mode
中,當選擇Default時,它取決於綁定的屬性。對於WPF控件,Binding.Mode = Default的默認值是什麼?
我正在尋找一些列表或一些約定或任何信息的各種控制的默認值。
我的意思是,什麼屬性默認爲TwoWay
等等。 任何鏈接,想法,想法,甚至咆哮都很好!
到UpdateSourceTrigger類似,用於Mode屬性 的 默認值每個屬性變化。 用戶可編輯的屬性,如
TextBox.Text
,ComboBox.Text
,MenuItem.IsChecked
等,具有TwoWay
作爲其默認模式值。如果圖 如果默認爲TwoWay
,請查看 屬性的依賴屬性信息 部分。如果說BindsTwoWayByDefault
設置爲true, 那麼 屬性的默認模式值TwoWay
。要以編程方式執行 ,請致電GetMetadata
以獲取屬性的元數據 ,然後檢查BindsTwoWayByDefault
屬性的布爾值 的值。
來源: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 ) );
注意到一個參數傳遞給Register方法表明 默認綁定模式:
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault
。如果您使用 反射來看看登記的TextBlock的文本DP,你 會看到,沒有這樣的值傳遞,在這種情況下,我們假設 結合是默認的一種方式。
東亞銀行Stollnitz的帖子摘自:How can I update an explicit binding within a template?
雖然具有某種重要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
有趣的是,大多數控件都有一個TextSearch屬性,它具有雙向綁定。
有沒有一個地方可以找到所有屬性及其BindingMode默認值列表?規則是什麼? – Shimmy 2010-08-05 17:56:47
屬性列表是無止境的。我想http://msdn.microsoft.com列出了來自微軟的大部分。我沒有看到任何信息和綁定模式,所以我想你必須自己找到。我在答案中給出的url解釋瞭如何找到它們 – 2010-08-05 18:26:41
那些元數據是UIPropertyMetadata而不是FrameworkPropertyMetadata的依賴屬性呢?這些屬性的MSDN文檔沒有提到BindsTwoWayByDefault,因爲該布爾值在UIPropertyMetadata上不存在。 – HappyNomad 2011-01-04 15:27:52