Frage

Ich habe ein Problem mit Datacontextchanged nicht auf einem logischen Kind meiner benutzerdefinierten Panel-Steuerelement angehoben wird. Ich habe es verengt unten zu diesem:

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, funktioniert dies, weil der Datacontext ist ein vererbbar Abhängigkeitseigenschaft .

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

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

Wenn ich dies ausführen, nur die ersten Event-Handler wird ausgeführt. Warum ist das Wenn statt AddLogicalChild (ELT) ich wie folgt vor:?

this.Content = elt;

werden beide Handler auszuführen. Aber das ist keine Option in meinem Fall - ich hinzufüge FrameworkContentElements zu meiner Kontrolle, die angeblich nicht visuelle Kinder.

Was ist denn hier los? Sollte ich mehr tun, etwas anderes als AddLogicalChild (), damit es funktioniert?

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

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

Danke.

War es hilfreich?

Lösung

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

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

Natürlich, werden Sie wollen keine logischen Kinder von der Basisimplementierung definiert zurückzukehren, auch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top