2009-11-25 23 views

Odpowiedz

48

podobne do UpdateSourceTrigger wartość domyślną właściwości trybu różna dla każdej nieruchomości. właściwości użytkownika do edycji, takich jak TextBox.Text, ComboBox.Text, MenuItem.IsChecked, etc, mają TwoWay jako ich wartości domyślne Tryb. Aby dowiedzieć się, out, jeśli domyślną wartością jest TwoWay, spójrz na w sekcji informacji o zależnościach w zależności od właściwości obiektu . Jeśli jest napisane, że BindsTwoWayByDefault ma wartość true, , wówczas domyślna wartość właściwości to TwoWay. Aby to zrobić programowo uzyskać metadane Nieruchomość wywołując GetMetadata a następnie sprawdzić logiczną wartość właściwości BindsTwoWayByDefault .

Źródło: http://blogs.msdn.com/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

Najbezpieczniej byłoby, aby zawsze być jawne, jaki rodzaj trybu wiązania chcesz od wiążące.

+2

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

+0

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źć. –

+3

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

8

Oto sposób, aby znaleźć domyślnego trybu obsługiwanego przez DP -

.NET Reflector jest twoim przyjacielem. Za pomocą reflektora wyszukaj TextBox i spójrz na źródło statycznego konstruktora (.cctor()). Tutaj będą mogli znaleźć kod używany do rejestrowania 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 
        ) 
       ); 

zauważyć, że parametr jest przekazywany do metody rejestru wskazujący domyślnego trybu Binding: FrameworkPropertyMetadataOptions.BindsTwoWayByDefault. Jeśli użyjesz reflektora do obejrzenia rejestracji dla TextBlock's Text DP, zobaczysz, że żadna taka wartość nie jest przekazywana, w takim przypadku zakładamy, że powiązanie jest w pewien sposób jednokierunkowe.

Zrobione ze stanowiska Bea Stollnitz za: How can I update an explicit binding within a template?

Chociaż ma jakąś listę ważnych DP byłyby bardzo pomocne.

0

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.

Powiązane problemy