WPF TemplateBinding vs RelativeSource TemplatedParent


169

Apa perbedaan antara 2 binding ini:

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{TemplateBinding Property=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>

dan

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>

?


17
jika Anda membutuhkan TwoWay Binding, Anda harus menggunakan opsi kedua
Joachim Kerschbaumer

Jawaban:


207

TemplateBinding bukan hal yang sama. Dokumen MSDN sering ditulis oleh orang-orang yang harus menanyai SDE bersuku kata satu tentang fitur perangkat lunak, sehingga nuansa tidak tepat.

TemplateBindings dievaluasi pada waktu kompilasi terhadap tipe yang ditentukan dalam template kontrol. Ini memungkinkan instantiasi template terkompilasi yang jauh lebih cepat. Hanya mencari-cari nama di templatebinding dan Anda akan melihat bahwa kompiler akan menandainya.

Markup yang mengikat diselesaikan pada saat runtime. Meskipun lebih lambat untuk dieksekusi, pengikatan akan menyelesaikan nama properti yang tidak terlihat pada jenis yang dinyatakan oleh templat. Dengan lebih lambat, saya akan menunjukkan bahwa jenisnya relatif karena operasi pengikatan mengambil sangat sedikit cpu aplikasi. Jika Anda meledakkan templat kontrol sekitar dengan kecepatan tinggi, Anda mungkin akan melihatnya.

Sebagai praktik, gunakan Bilah Template saat Anda bisa tetapi jangan takut pada Binding.


18
Jadi pikiran utama yang perlu diingat: Kompilasi waktu vs Runtime. TemplateBinding tidak akan berfungsi jika Anda mencobanya untuk berubah selama runtime. Baik ?
PaN1C_Showt1Me

3
Perhatikan juga bahwa menggunakan Binding sebagai ganti Binding Template dapat memiliki implikasi terhadap apa yang Anda lihat selama Waktu Desain. Dalam konfigurasi tertentu, properti yang terikat menggunakan {Binding RelativeSource ...} tidak akan muncul di perancang (meskipun masih muncul saat run time), tetapi jika Anda beralih menggunakan {TemplateBinding ...} properti tersebut dievaluasi selama Waktu Desain.
lfalin

Satu hal yang akan saya tambahkan seandainya ini membantu pengunjung di masa depan adalah bahwa karena TemplateBinding dievaluasi pada waktu kompilasi Anda tidak dapat menggunakan TemplateBinding untuk mengikat ke properti terlampir yang ditentukan pengguna. Dalam hal properti terlampir yang ditentukan pengguna, Anda harus menggunakan "{Binding RelativeSource = {RelativeSource TemplatedParent} ...}"
MNB

35

TemplateBinding - Lebih membatasi daripada menggunakan Binding biasa

  • Lebih efisien daripada Binding tetapi kurang fungsional
  • Hanya berfungsi di dalam pohon visual ControlTemplate
  • Tidak bekerja dengan properti di Freezables
  • Tidak berfungsi dalam Pemicu ControlTemplate
  • Memberikan cara pintas dalam menyetel properti (bukan sebagai bertele-tele), mis {targetBroperty TemplateBinding}

Binding Reguler - Tidak memiliki batasan TemplateBinding di atas

  • Menghargai Properti Induk
  • Atur Ulang Nilai Target untuk menghapus nilai yang ditetapkan secara eksplisit
  • Contoh: <Ellipse Fill = "{Binding RelativeSource = {RelativeSource TemplatedParent}, Path = Latar Belakang}" />

22

Satu hal lagi - TemplateBindings tidak memungkinkan konversi nilai. Mereka tidak memungkinkan Anda untuk melewati Konverter dan tidak secara otomatis mengkonversi int ke string misalnya (yang normal untuk Binding).


1
Terima kasih Miroslav, ini adalah masalah yang saya temui, beralih menggunakan TemplatedParent memecahkan masalah.
MikeKulls

17

TemplateBinding adalah singkatan untuk Mengikat dengan TemplatedParent tetapi tidak mengekspos semua kemampuan kelas Binding, misalnya Anda tidak dapat mengontrol Binding.Mode dari TemplateBinding.


1

Saya pikir TemplateBinding tidak mendukung tipe Freezable (yang termasuk objek kuas). Untuk mengatasi masalah tersebut. Satu dapat menggunakan TemplatedParent


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.