Ich versuche, eine Textbeschriftung im Hintergrund eines TextBox mit angehängten Eigenschaften zu erstellen, aber ich kann die Bindung an die Textbeschriftung in einer Stilressource nicht auflösen:
Stildefinition:
%Vor%Angehängte Eigenschaft:
%Vor%Verwendung:
%Vor%Die Idee ist, dass Sie die Texteingabeaufforderung definieren können, die im visuellen Pinsel verwendet wird, wenn Sie das Textfeld erstellen, aber ich bekomme einen verbindlichen Fehler:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.TextBox', AncestorLevel='1''. BindingExpression:Path=(0); DataItem=null; target element is 'Label' (Name=''); target property is 'Content' (type 'Object')
Der Code funktioniert einwandfrei, wenn ich nur die Label.Content-Eigenschaft im Stil fest codiere.
Irgendwelche Ideen?
Das Problem ist, dass das Label
innerhalb des VisualBrush
kein visuelles Kind des TextBox
ist, das ist der Grund, warum diese Bindung nicht funktioniert. Meine Lösung für dieses Problem wird die Bindung ElementName
verwenden. Der visuelle Pinsel, den Sie erstellen, befindet sich jedoch in der Wörterbuchressource Style
und dann funktioniert die Bindung ElementName
nicht, da die Element-ID nicht gefunden wird. Die Lösung dafür ist das Erstellen der VisualBrush
in globalen Wörterbuchressourcen. Sehen Sie sich diesen XAML-Code an, um die VisualBrush
:
Dieser Code sollte funktionieren. Es muss kein Code mehr geändert werden, daher überschreibe ich nicht den ganzen Code.
Ich hoffe, diese Lösung funktioniert für Sie ...
Das Problem hat damit zu tun, wie Style
funktioniert: Im Grunde wird eine Kopie von Style
erstellt (bei der ersten Referenz), und zu diesem Zeitpunkt kann es mehrere% geben. co_de% controls Sie möchten, dass TextBox
angewendet wird - welche wird sie für die RelativeSource verwenden?
Die (wahrscheinliche) Antwort besteht darin, eine Style
anstelle von Template
zu verwenden - mit einer Kontroll- oder Datenvorlage können Sie auf die visuelle Struktur von Style
zugreifen, und das sollte Sie erreichen wo du sein musst.
EDIT: Wenn ich weiter darüber nachdenke, kann ich hier falsch sein ... Ich werde ein schnelles Testgeschirr zusammenwerfen, wenn ich wieder vor einem Computer bin und sehen, ob ich das beweisen / widerlegen kann.
WEITER EDIT: Obwohl das, was ich ursprünglich gesagt habe, wohl "wahr" war, ist das nicht dein Problem; Was Raul sagte: Der visuelle Baum ist korrekt:
TemplatedParent
-Eigenschaft für die Background
auf eine TextBox
-Instanz. VisualBrush
dieses Pinsels ist nicht in den visuellen Baum des Steuerelements eingeordnet. Visual
-Navigation fehlschlägt, da das übergeordnete Element dieses visuellen Objekts null ist. {RelativeSource FindAncestor}
oder als Style
deklariert ist. ControlTemplate
zu vertrauen, ist definitiv nicht ideal, da es die Wiederverwendbarkeit der Definition verringert. Also, was tun?
Ich habe mir über Nacht den Kopf zerbrochen, als ich mir überlegt habe, wie ich mit wenig Erfolg über den richtigen Vererbungskontext für den enthaltenen Pinsel vorgehen kann ... Ich habe diesen super-hacky Weg jedoch:
Zuerst die helper -Eigenschaft (Hinweis: Normalerweise style ich meinen Code nicht so, sondern versuche Platz zu sparen):
%Vor%Und jetzt das aktualisierte XAML:
%Vor%