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!
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.
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.
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.
Fügen Sie diese BindingProxy-Klasse zu Ihrem Projekt hinzu:
%Vor%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}}
Tags und Links wpf user-controls datacontext