Szukałem również listy, głównie w celu ustalenia, które powiązania mogą być ustawione w jedną stronę, aby poprawić wydajność.Następujące funkcje mogą pomóc znaleźć który kontroluje używać wiązania dwukierunkowe domyślnie:
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;
}
Korzystanie z funkcji drukowania, daje nam listę:
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}");
}
}
wynik próbki (Properties dwukierunkowy wiążący jako domyślne)
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
co ciekawe, większość sterujące mają właściwość TextSearch który ma wiązania dwukierunkowe.
Czy istnieje miejsce, w którym można znaleźć listę wszystkich właściwości i ich domyślnych ustawień BindingMode? jakie są zasady? – Shimmy
Lista właściwości jest nieskończona. Wydaje mi się, że http://msdn.microsoft.com wymienia większość tych z Microsoft. Nie widzę żadnych informacji i trybu powiązania, więc domyślam się, że sam musisz to stwierdzić. Adres URL podany w odpowiedzi wyjaśnia, jak je znaleźć. –
Co z właściwościami zależności, których metadanymi są UIPropertyMetadata, a nie FrameworkPropertyMetadata? Dokumenty MSDN dla takich właściwości nie wymieniają BindsTwoWayByDefault, ponieważ ta wartość boolowska nie istnieje w UIPropertyMetadata. – HappyNomad