Ich habe ein wpf-Benutzersteuerelement, das eine einzelne benutzerdefinierte Abhängigkeitseigenschaft verfügbar macht. Innerhalb des Benutzersteuerelements wird ein Textblock an den Wert von dp gebunden. Diese Datenbindung funktioniert in allen Szenarien, außer wenn die Datenquelle ein Objekt ist.
Der minimale Code, der erforderlich ist, um dies zu reproduzieren, ist:
Dies ist der Hauptteil des Benutzersteuerelements
%Vor%und der Benutzersteuercode dahinter:
%Vor%Dies ist das Testfenster. Ich habe meinen Projekt-XML-Namespace als "benutzerdefiniert"
importiert %Vor%und der Code des Testfensters ist:
%Vor% Wenn ich die Diagnoseablaufverfolgung auf TestWindow einschalte, spuckt sie den Fehler "BindingExpression path error" aus:
'SomeData' property not found on 'object' ''SimpleUC' (Name='')' ... "
Der Bindungsausdruck ist derselbe wie der, den ich bei dem benachbarten Etikett verwendet habe, und es hat gut funktioniert. Dieses Verhalten scheint mir wirklich bizarr. Kann jemand etwas Licht werfen?
Sie haben hier den DataContext Ihres SimpleUC gesetzt
%Vor%also wenn du hier Binding verwendest
%Vor% Es wird die Eigenschaft SomeData im Datenkontext des Steuerelements durchsucht, die auf dieses Objekt gesetzt ist, da der Code im SimpleUC-Konstruktor den Wert von DataContext überschreibt und nicht mehr wie erwartet auf das TestWindow-Objekt gesetzt wird. Deshalb funktioniert Ihre Lösung - sie wirkt sich nicht auf den DataContext aus, der vom Fenster geerbt wird. Sie können auch this.DataContext = this;
beibehalten, aber das Element festlegen, nach dem die Eigenschaft explizit wie folgt gesucht wird (übersprungen irrelevant)
Aber meine Meinung ist, dass Ihre Variante aus der Antwort für mich praktischer erscheint. Das Festlegen des Datenkontexts auf das ist keine sehr gute Übung.
Ich hoffe, es hilft.
Wenn Sie müssen ein UserControl
verwenden, ist Ihr
ist ein guter Weg, es zu tun und
%Vor%ist besser, weil Sie sich nicht auf die Kontrollhierarchie und mögliche Instanziierungsreihenfolgenprobleme verlassen.
Ich würde jedoch für diese Art von Situation empfehlen, dass Sie "benutzerdefinierte Steuerelemente" anstelle von "Benutzersteuerelementen" verwenden. Sie brauchen ein bisschen gewöhnungsbedürftig, aber sie sind viel mächtiger, weil ihr XAML die Vorlage selbst ist, was bedeutet, dass Sie TemplateBinding
und {RelativeSource TemplatedParent}
verwenden können.
In jedem Fall ist DataContext = this;
definitiv zu vermeiden.
Tags und Links wpf data-binding user-controls