Wie kann ich eine angefügte Eigenschaft in einer Style.Resource binden?

8

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?

    
glasswall 29.11.2012, 17:36
quelle

2 Antworten

2

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 :

zu löschen %Vor%

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 ...

    
Raúl Otaño 29.11.2012 20:29
quelle
1

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:

  • Sie setzen die TemplatedParent -Eigenschaft für die Background auf eine TextBox -Instanz.
  • Der VisualBrush dieses Pinsels ist nicht in den visuellen Baum des Steuerelements eingeordnet.
  • Dies führt dazu, dass die beliebige Visual -Navigation fehlschlägt, da das übergeordnete Element dieses visuellen Objekts null ist.
  • Dies ist der Fall, unabhängig davon, ob es als {RelativeSource FindAncestor} oder als Style deklariert ist.
  • Alles, was gesagt wurde, auf 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%     
JerKimball 29.11.2012 19:55
quelle

Tags und Links