Was ist die Vorlagenbindung gegenüber der Bindung?

118

Ich konnte es nicht verstehen BorderThickness="{TemplateBinding BorderThickness}. Hier der Code:

<ControlTemplate TargetType="{x:Type wpftoolkit:DataGridCell}">
    <Border Padding="{TemplateBinding Padding}" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            BorderThickness="{TemplateBinding BorderThickness}" 
            Background="{TemplateBinding Background}" 
            SnapsToDevicePixels="True">
        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
    </Border>
</ControlTemplate>

Bitte erläutern Sie auch andere Bindungsarten.

prjndhi
quelle
warum diese Rückkehr und warum BorderThickness zweimal schreiben "" BorderThickness = "{TemplateBinding BorderThickness}" "
prjndhi
1
@Euphoric Diese Seite scheint das erste Google-Ergebnis für diese Abfrage zu sein. ;)
ANeves

Antworten:

204

TemplateBinding wird zum Binden an die Elementeigenschaften innerhalb der Vorlagendefinition verwendet. In Ihrem Beispiel hätten Sie schreiben können

 <Border Padding="{Binding Padding}" ...>

bedeutet, die Auffüllungseigenschaft des Rahmens an die Auffüllungseigenschaft von ... was zu binden ? Sie möchten sagen: "Auffüllungseigenschaft des Steuerelements, für das diese Vorlage verwendet wird." Sie können ihm keinen Namen geben, da Sie den x: Namen des Steuerelements zu diesem Zeitpunkt nicht kennen (selbst wenn Sie dies tun würden, würde es nicht funktionieren, da es sich in einem anderen Namescope befindet). Sie können dies jedoch tun, indem Sie eine relative Quelle definieren

<Border Padding="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}" ...>

oder verwenden Sie TemplateBinding, eine Verknüpfung (*) für oben

<Border Padding="{TemplateBinding Padding}" ...>

(*) TemplateBinding ist in diesen Template-Szenarien nicht nur weniger ausführlich, sondern weist auch einige Unterschiede zu einer regulären Bindung auf:

  • Es wird zur Kompilierungszeit ausgewertet. (Wenn beispielsweise die Padding-Eigenschaft nicht vorhanden wäre, würde ein Kompilierungsfehler angezeigt. Wenn Sie jedoch eine Bindung mit TemplatedParent verwenden würden, würde der Fehler nur zur Laufzeit angezeigt.)
  • Es ist immer eine Einwegbindung.
  • Es ist erforderlich, dass sowohl die Quell- als auch die Zieleigenschaften Abhängigkeitseigenschaften sind .
  • Es hat viel weniger Funktionalität (kein StringFormat, Delay, IsAsync usw. siehe die Eigenschaften von Binding vs TemplateBindingExtention ).
Eren Ersönmez
quelle
58

Ein Bild sagt mehr als tausend Worte. In diesem Fall ist es ein 7-minütiges Video: https://www.youtube.com/watch?v=z-0TZR-7xLI

EDIT: Beispiel:

  • A Buttonverfügt über eine Standard - ControlTemplateEigenschaft und HeightEigentum
  • Sie überschreiben die ControlTemplateEigenschaft von a, Buttonindem Sie Ihre eigene schreiben (zum Beispiel möchten Sie eine Ellipse-looking-Schaltfläche anstelle von Rectangle-looking erstellen).
  • Nachdem Sie eine Ellipseneue erstellt haben ControlTemplate, möchten Sie Ellipse, dass die Größe der ursprünglichen Button- HeightEigenschaft entspricht
  • Sie verwenden also TemplateBinding, um Referenzen zu referenzieren Button, Heightohne sie zu benennenGeben Sie hier die Bildbeschreibung ein
Schlecht
quelle
Während dies theoretisch die Frage beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Bhargav Rao
32

Eren Ersönmenz hat es bereits recht gut erklärt, aber ich möchte ihm eine andere Perspektive geben, um das Konzept besser zu verstehen.

In WPF ist jedes Steuerelement mehr oder weniger von seiner Darstellung getrennt. Sie können die Vorlage von Steuerelementen jederzeit ändern und sie ganz anders aussehen lassen. Eine Schaltfläche funktioniert wie erwartet mit einer, die beispielsweise ControlTemplatenur aus a besteht Rectangle. Jetzt ist es manchmal notwendig ControlTemplate, dass die Eigenschaften des logischen Teils eines Steuerelements tatsächlich verwendet werden. Und das TemplateBindingist es, was es sagt: ControlTemplate"Verwenden Sie diese Eigenschaft des Steuerelements, das wir der visuellen Präsentation geben". Ein gutes Beispiel ist die BackgroundEigenschaft für jedes Steuerelement, sie hat keine eigene Bedeutung, sie erhält ihre Bedeutung von TemplateBindingihr für die untergeordnete Steuerung in der ControlTemplate.

Die Bindung allein ist im MSDN sehr gut beschrieben . Dies ist ein sehr schöner Spickzettel, der tatsächlich direkt neben mir an meiner Wand hängt. Es gibt einen guten Überblick über die verschiedenen verfügbaren Bindungen.

dowhilefor
quelle
6

Von Template Markup - Erweiterung , TemplateBindingverbindet den Wert einer Eigenschaft in einer Steuerelementvorlage auf den Wert einer anderen offengelegte Eigenschaft auf der Templat Kontrolle. Mit anderen Worten, es dient zum Binden von Werten in einer Vorlage.

Durch das Binden wird eine Eigenschaft zum Binden von Zielen und Datenquellen verbunden.

Zabavsky
quelle