2009-04-06 8 views
2

Ich habe ein Problem mit DataContextChanged nicht auf einem logischen Kind meines benutzerdefinierten Panel-Steuerelement ausgelöst werden. Ich habe es verengt diese nach unten:WPF: Warum wird DataContextChanged nicht auf einem logischen Kind ausgelöst?

Ausgehend von einem Assistenten generierte WPF-Anwendung ich hinzufügen:

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     var elt = new FrameworkElement(); 
     this.AddLogicalChild(elt); 
     DataContext = 42; 
     Debug.Assert((int)elt.DataContext == 42); 
    } 

Wie ich verstehe, das funktioniert, weil die Datacontext ein inheritable dependency property ist.

Nun, ich Event-Handler für Datacontextchanged sowohl auf dem Fenster (dies) und sein logisches Kind hinzu:

this.DataContextChanged += 
     delegate { Debug.WriteLine("this:DataContextChanged"); }; 
    elt.DataContextChanged += 
     delegate { Debug.WriteLine("elt:DataContextChanged"); }; 

Wenn ich dies ausführen, nur der erste Event-Handler wird ausgeführt. Warum ist das? Wenn statt AddLogicalChild (ELT) Ich folgend:

this.Content = elt; 

beiden Handler ausgeführt werden. Aber das ist in meinem Fall keine Option - ich füge FrameworkContentElements zu meinem Steuerelement hinzu, die keine visuellen Kinder sein sollen.

Was geht hier vor? Sollte ich etwas mehr als AddLogicalChild() tun, damit es funktioniert?

(Glücklicherweise gibt es eine ziemlich einfache Abhilfe - nur das Datacontext des Elements mit dem Datacontext des Fensters binden)

BindingOperations.SetBinding(elt, FrameworkElement.DataContextProperty, 
      new Binding("DataContext") { Source = this }); 

Danke.

Antwort

5

Sie müssen auch die LogicalChildren Eigenschaft außer Kraft zu setzen:

protected override System.Collections.IEnumerator LogicalChildren 
{ 
    get { yield return elt; } 
} 

Natürlich, werden Sie keine logischen Kinder durch die Basisimplementierung definiert zurückkehren wollen, auch.

+0

Ja, das war's! Danke, Kent! –

Verwandte Themen