So greifen Sie von einem UserControl auf den DataContext des Parents zu

8

Ich muss auf den DataContext des Containers von einem UserControl (ein Raster mit Textfeldern und einem Listenfeld: ich muss Elemente in dieses Listenfeld einfügen) zugreifen, die ich in WPF erstellt habe: Was ist der beste Weg, dies zu tun? Ich habe mir überlegt, den DataContext als Parameter an die Benutzersteuerung zu übergeben, denke aber, dass es einen saubereren Weg dafür gibt.

Vielen Dank im Voraus!

    
Cris 04.07.2011, 19:00
quelle

4 Antworten

10

Normalerweise wird die DataContext geerbt , nur nicht explizit auf der UserControl und es wird von seinem Elternteil erhalten. Wenn Sie es einstellen müssen, können Sie trotzdem das Parent verwenden Eigenschaft, um das Elternelement zu erhalten, das Sie dann in ein FrameworkElement umwandeln können. Wenn es nicht null ist, können Sie dessen DataContext verwenden.

    
H.B. 04.07.2011 19:07
quelle
6

Ich habe manchmal Benutzersteuerelemente verschachtelt, und ein Enkelkind-Benutzersteuerelement benötigt manchmal den Datenkontext der Großelternansicht. Der einfachste Weg, den ich bisher gefunden habe (und ich bin ein Neuling), ist folgendes:

%Vor%

Ich habe ein ausführlicheres Beispiel in meinem Blog erstellt, wenn Sie weitere Informationen wünschen.

    
Tod 27.10.2011 19:13
quelle
1

H.B. Beantwortet die Frage in Ihrem Titel.

Der Text wirft jedoch eine andere Designfrage auf. Ich würde Sie bitten, Ihr Design zu überdenken.

Ein Steuerelement erbt die DataContext-Eigenschaft seines Vorfahrs, solange keine dazwischen explizit überschrieben wird.
Wenn das Benutzersteuerelement Daten benötigt, sollte es von seiner Datenquelle (ein Ansichtsmodell für das Benutzersteuerelement) abgerufen werden. In diesem Fall kann das Benutzersteuerelement die erforderlichen Daten von der ListItemsForDisplay -Eigenschaft abrufen, die in der SomeViewModel -Instanz verfügbar ist. Keine Notwendigkeit, Elternteil und Besetzung zu bekommen. Viel sauberer.

%Vor%     
Gishu 05.07.2011 05:32
quelle
1

Fügen Sie diese BindingProxy-Klasse zu Ihrem Projekt hinzu:

%Vor%
  1. Fügen Sie den BindingProxy den Ressourcen Ihres UserControls hinzu.
  2. Legen Sie die 'Data' Eigenschaft des BindingProxy auf was auch immer Sie benötigen, z. Suche nach einem übergeordneten Fenster. Data="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},Path=DataContext}" Wenn Sie etwas komplizierteres benötigen, können Sie einen benutzerdefinierten Konverter verwenden.

Jetzt haben Sie Zugriff auf den DataContext des Elternteils: {Binding Data.MyCommand, Source={StaticResource BindingProxy}}

%Vor%     
jv_ 27.08.2016 04:01
quelle

Tags und Links