2012-06-26 11 views
9

Mam problem, w którym muszę wiedzieć o wszystkich powiązaniach, które zostały wprowadzone do właściwości zależności mojego obiektu. Obecnie używam iteracji po właściwościach zależności, gdy zmienia się mój format danych i szukają wyrażeń wiążących. Ale odkryłem, że w niektórych przypadkach (TabControls) kontekst danych wydaje się być ustawiony jako pierwszy, a następnie zastosowane wiązania z XAML.Czy zdarzenie jest uruchamiane, gdy powiązanie zostało ustawione dla właściwości?

Czy istnieje sposób, w jaki mogę wykryć wiązanie stosowane do jednej z moich właściwości zależności?

+0

Dlaczego robisz że? – MBen

+0

Jest to nieco skomplikowane, ale zasadniczo jest tak, że obiekt będący kontekstem danych (klasa pomocnicza, która pomaga wizualizować dane innej klasy) wie, że ta kontrolka przedstawia interfejs do edycji obiektu, który jest przechowywany w właściwość określona w ścieżce wyrażeń wiążących. – JoshG

Odpowiedz

7

Zakładając, że są wewnątrz UserControl, powinieneś być w stanie korzystać z Loaded wydarzenie dla tego. To zdarzenie jest wywoływane, gdy "element jest ułożony, renderowany i gotowy do interakcji". Mogę tylko założyć, że to oznacza, że ​​wiązania zostały zakończone.

Można było wtedy, w handler Loaded wydarzenie tylko powiedzieć datacontext, które są wiążące dla niego.

Jeśli spodziewasz się zmiany formatu danych, musisz połączyć to z obsługą zdarzeń DataContextChanged.

+0

Dzięki za zrozumienie mojego pytania. Tego właśnie szukałem! Właśnie sprawdziłem i twoje założenie wydaje się podtrzymywać. Dzięki – JoshG

+2

W rzeczywistości, 'Loaded' i' Unloaded' są wywoływane za każdym razem, gdy element jest załadowany/rozładowywany z drzewa wizualnego, i może się zdarzyć wiele razy podczas okresu życia tego elementu (np. Zmiana motywu może spowodować przeładowanie elementu). – Grx70

+0

Jesteś oczywiście poprawny @ Grx70 - Byłem młody niedoświadczony, gdy napisałem tę odpowiedź ;-) Usunąłem to zdanie teraz. –

-1

Podnoszenie zdarzenia po zmianie właściwości jest dokładnie tym, co robi INotifyPropertyChanged. Jest wymagany jeden członek wdrożyć INotifyPropertyChanged i to zdarzenie PropertyChanged

próbki i więcej szczegółów: Raise an event whenever a property's value changed?

+0

Nie chcę wiedzieć, kiedy zmieni się nieruchomość. Chcę wiedzieć, kiedy powiązanie zostało połączone z usługą. Nie wierzę, że twoje rozwiązanie to robi? Właściwość mogła nie zostać zmieniona przez połączenie powiązania. tj. value = null, with binding, value still = null. – JoshG

2

Zakładam, że yr używając prywatnego statycznego DataContextChanged zdarzenie wiedzieć kiedy yr datacontext zmienia prawo

tutaj jest niektóre z moich kodu to co mam zrobić

public static readonly DependencyProperty ApplicationDataContextProperty = 
      DependencyProperty.Register("ApplicationDataContext", 
      typeof(Object), 
      typeof(MyControl), 
      new PropertyMetadata(MyControl_DataContextChanged)); 

// my constructor 

     public MyControl() 
     { 

       InitializeComponent(); 

       if (!DesignerProperties.GetIsInDesignMode(new DependencyObject())) 
       { 
        SetBinding(ApplicationDataContextProperty, new Binding()); 
       } 

     } 

// my event 
     private static void MyControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
     { 

       MyControl thisControl = sender as MyControl 
       if (thisControl != null) 
       { 
        INotifyPropertyChanged propertyChanged; 
        propertyChanged = e.OldValue as INotifyPropertyChanged; 
        if (propertyChanged != null) 
         propertyChanged.PropertyChanged -= thisControl.propertyChanged_PropertyChanged; 


        propertyChanged = e.NewValue as INotifyPropertyChanged; 
        if (propertyChanged != null) 
         propertyChanged.PropertyChanged += thisControl.propertyChanged_PropertyChanged; 
       } 

     } 

// my 2e event 
     void propertyChanged_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 

       if (e.PropertyName == "ListWithUsers") 
        LoadGrid(); 


     } 
+0

Tak, używam DataContextChanged + = obsługi zdarzenia. Robię to przed InitializeComponent() w konstruktorze mojego sterowania. Wewnątrz OnDataContextChanged zwraca wartość null dla wyrażeń wiążących, które są z pewnością związane (wiązanie działa wizualnie). Ale oczywiście nie zostały jeszcze przydzielone. – JoshG

+0

Jeśli po prostu zmieniam kontekst danych, a następnie, ponieważ formant został już zainicjowany, to wyrażenia wiążące powracają idealnie. – JoshG

+0

Hmm ... W jaki sposób zmiana kontekstu danych pomaga mi wykryć, kiedy powiązanie zostało zastosowane do mojego obiektu? – JoshG

Powiązane problemy