Czym jest powiązanie szablonu, a co powiązanie?

118

Nie mogłem zrozumieć BorderThickness="{TemplateBinding BorderThickness}. Tutaj kod:

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

Prosimy również o wyjaśnienie innych rodzajów wiązań.

prjndhi
źródło
dlaczego ten powrót i dlaczego BorderThickness pisze dwa razy "" "BorderThickness =" {TemplateBinding BorderThickness} "" "
prjndhi
1
@Euphoric ta strona wydaje się być pierwszym wynikiem Google dotyczącym tego zapytania. ;)
ANeves

Odpowiedzi:

204

TemplateBinding służy do tworzenia powiązań z właściwościami elementu w definicji szablonu. W swoim przykładzie mogłeś napisać

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

co ma na celu powiązanie właściwości wypełnienia obramowania z właściwością wypełnienia… czego? Chciałbyś powiedzieć: „właściwość dopełniania kontrolki, do której jest używany ten szablon”. Nie możesz nadać mu nazwy, ponieważ w tej chwili nie znasz x: Nazwa kontrolki (nawet gdybyś to zrobił, nie zadziała, ponieważ znajduje się w innym zakresie nazw). Możesz to jednak zrobić, definiując źródło względne

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

lub użyj TemplateBinding, które jest skrótem (*) do powyższego

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

(*) Oprócz tego, że jest mniej rozwlekły w tych scenariuszach tworzenia szablonów, TemplateBinding ma kilka różnic w porównaniu ze zwykłym powiązaniem:

  • Jest oceniany w czasie kompilacji. (gdyby na przykład właściwość Padding nie istniała, wystąpiłby błąd kompilacji. Ale gdybyś użył powiązania z TemplatedParent, zobaczyłbyś błąd tylko w czasie wykonywania).
  • Jest to zawsze wiązanie jednostronne.
  • Wymaga, aby zarówno właściwości źródłowe, jak i docelowe były właściwościami zależności .
  • Ma znacznie mniejszą funkcjonalność (bez StringFormat, Delay, IsAsync itp. Zobacz właściwości Binding vs TemplateBindingExtention ).
Eren Ersönmez
źródło
58

Obraz jest wart tysiąca słów. W tym przypadku jest to 7 minut wideo: https://www.youtube.com/watch?v=z-0TZR-7xLI

EDYCJA: Przykład:

  • A Buttonma domyślną ControlTemplatewłaściwość i Heightwłaściwość
  • Nadpisujesz ControlTemplatewłaściwość a Button, pisząc własną (na przykład chcesz utworzyć Ellipseprzycisk -widok zamiast Rectangle-widzenia)
  • Po utworzeniu Ellipsenowego ControlTemplate, chcesz Ellipsemieć ten sam rozmiar, co oryginalna Heightwłaściwość Button
  • Więc używać TemplateBindingw celu odniesienia Button„s Heightbez nazywania gowprowadź opis obrazu tutaj
Zły
źródło
Chociaż może to teoretycznie odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj zasadnicze części odpowiedzi i podać link do odniesienia.
Bhargav Rao
32

Eren Ersönmenz wyjaśnił to już całkiem dobrze, ale chciałbym nadać mu inną perspektywę, aby lepiej zrozumieć tę koncepcję.

W WPF każda kontrolka jest mniej więcej oddzielona od swojej prezentacji. Zawsze możesz zmienić szablon kontrolek i sprawić, by wyglądał zupełnie inaczej. Przycisk działa zgodnie z oczekiwaniami z na przykład ControlTemplatetylko składającym się z Rectangle. Czasami konieczne jest, ControlTemplateaby faktycznie używał właściwości logicznej części kontrolki. I to TemplateBindingdo tego po prostu mówi ControlTemplate„Użyj tej właściwości kontrolki, którą dajemy wizualną prezentację”. Dobrym przykładem jest Backgroundwłasność na każdej kontrolce, która sama w sobie nie ma znaczenia, uzyskuje swoje znaczenie TemplateBindingdo kontroli potomnej w ControlTemplate.

Samo wiązanie jest bardzo dobrze opisane w MSDN . To bardzo fajna ściągawka, która w rzeczywistości wisi na mojej ścianie tuż obok mnie. Daje dobry przegląd wszystkich różnych dostępnych wiązań.

w dółhilefor
źródło
6

Od TemplateBinding Markup Extension , TemplateBindingłączy wartość właściwości w szablonie sterowania do wartości innej własności wyeksponowane na matrycy kontrolą. Innymi słowy, służy do wiązania wartości w szablonie.

Powiązanie łączy właściwość powiązań obiektów docelowych i źródeł danych.

Zabavsky
źródło