Apa itu template binding vs binding?

118

Saya tidak bisa mengerti BorderThickness="{TemplateBinding BorderThickness}. Berikut kodenya:

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

Jelaskan juga jenis penjilidan lainnya.

prjndhi
sumber
mengapa ini kembali dan mengapa BorderThickness menulis dua kali "" "BorderThickness =" {TemplateBinding BorderThickness} "" "
prjndhi
1
@Euphoric laman ini tampaknya menjadi hasil Google pertama untuk kueri itu. ;)
ANeves

Jawaban:

204

TemplateBinding digunakan untuk mengikat properti elemen dalam definisi template. Dalam contoh Anda, Anda bisa menulis

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

artinya mengikat properti padding perbatasan ke properti padding dari ... apa? Anda ingin mengatakan, "properti padding dari kontrol tempat template ini digunakan." Anda tidak dapat memberinya nama karena Anda tidak mengetahui x: Nama kontrol saat ini (meskipun Anda melakukannya, kontrol tidak akan berfungsi karena berada dalam namescope yang berbeda). Namun, Anda dapat melakukan ini dengan menentukan sumber relatif

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

atau gunakan TemplateBinding yang merupakan jalan pintas (*) untuk di atas

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

(*) Selain tidak terlalu bertele-tele dalam skenario pembuatan template ini, TemplateBinding memiliki beberapa perbedaan dibandingkan dengan binding biasa:

  • Itu dievaluasi pada waktu kompilasi. (jika, misalnya, properti Padding tidak ada, Anda akan mendapatkan error kompilasi. Tetapi jika Anda menggunakan binding dengan TemplatedParent, Anda hanya akan melihat error tersebut saat runtime.)
  • Itu selalu mengikat satu arah.
  • Ini mensyaratkan bahwa properti sumber dan target adalah properti ketergantungan .
  • Ini memiliki fungsionalitas yang jauh lebih sedikit (tidak ada StringFormat, Delay, IsAsync, dll. Lihat properti Binding vs TemplateBindingExtention ).
Eren Ersönmez
sumber
58

Sebuah gambar memiliki makna ribuan kata. Dalam kasus ini, ini adalah video 7 menit: https://www.youtube.com/watch?v=z-0TZR-7xLI

EDIT: Contoh:

  • Sebuah Buttonmemiliki default ControlTemplateproperti dan Heightproperti
  • Anda menimpa ControlTemplateproperti a Buttondengan menulis milik Anda sendiri (misalnya Anda ingin membuat Ellipsetombol-melihat alih-alih-melihat Rectangle)
  • Setelah Anda membuat Ellipsedi baru ControlTemplateAnda, Anda ingin Ellipsememiliki ukuran yang sama dengan Heightproperti Button asli
  • Jadi Anda gunakan TemplateBindinguntuk referensi Button's Heighttanpa penamaan itumasukkan deskripsi gambar di sini
Buruk
sumber
Meskipun ini secara teoritis dapat menjawab pertanyaan tersebut, akan lebih baik jika menyertakan bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Bhargav Rao
32

Eren Ersönmenz sudah menjelaskannya dengan cukup baik, tetapi saya ingin memberikan perspektif lain untuk lebih memahami konsepnya.

Dalam WPF setiap kontrol kurang lebih terlepas dari presentasinya. Anda selalu dapat mengubah template kontrol dan membuatnya terlihat sangat berbeda. Sebuah tombol berfungsi seperti yang diharapkan dengan ControlTemplatehanya terdiri dari Rectanglemisalnya. Sekarang terkadang perlu untuk ControlTemplatebenar-benar menggunakan properti dari bagian logika dari sebuah kontrol. Dan TemplateBindinguntuk itulah, ini hanya memberi tahu ControlTemplate"Gunakan properti kontrol ini yang kami berikan presentasi visual". Contoh yang baik adalah Backgroundproperti pada setiap kontrol, tidak ada artinya sendiri, ia mendapat maknanya oleh TemplateBindingkontrol anak di ControlTemplate.

Binding sendiri sangat bagus dijelaskan di MSDN . Ini adalah lembar contekan yang sangat bagus yang sebenarnya tergantung di dinding saya tepat di sebelah saya. Ini memberikan gambaran umum yang baik tentang semua binding berbeda yang tersedia.

dowhilefor
sumber
6

Dari TemplateBinding Markup Extension , TemplateBindingtautkan nilai properti di template kontrol ke nilai beberapa properti lain yang terpapar di kontrol template. Dengan kata lain, ini untuk mengikat nilai dalam template.

Binding menghubungkan properti target binding dan sumber data.

Zabavsky
sumber