WPF TemplateBinding vs RelativeSource TemplatedParent


169

Bu 2 bağ arasındaki fark nedir :

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

ve

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

?


17
TwoWay Binding ihtiyacınız varsa, ikinci seçeneği kullanmalısınız
Joachim Kerschbaumer

Yanıtlar:


207

TemplateBinding aynı şey değildir. MSDN belgeleri genellikle yazılım özellikleri hakkında tek heceli SDE'leri sorgulamak zorunda olan kişiler tarafından yazılır, bu nedenle nüanslar doğru değildir.

TemplateBindings derleme zamanında kontrol şablonunda belirtilen türe göre değerlendirilir. Bu, derlenmiş şablonların çok daha hızlı bir şekilde başlatılmasını sağlar. Sadece şablon bağlamada adınızı karıştırın ve derleyicinin onu işaretleyeceğini göreceksiniz.

Bağlama işaretlemesi çalışma zamanında çözülür. Yürütme daha yavaş olsa da, ciltleme şablon tarafından bildirilen türde görünmeyen özellik adlarını çözer. Yavaş yavaş, ciltleme işleminin uygulamanın CPU'su çok az sürdüğü için göreceli olduğunu belirteceğim. Kontrol şablonlarını yüksek hızda patlatıyorsanız, bunu fark edebilirsiniz.

Pratik olarak, Bağlama'dan korkabildiğiniz zaman ancak ŞablonBinding'ı kullanın.


18
Bu yüzden ana hatırlamak düşünüyorum: Zaman vs Runtime derleyin. TemplateBinding çalışma zamanı sırasında değiştirmeye çalışırsanız çalışmaz. Sağ ?
PaN1C_Showt1Me

3
Ayrıca TemplateBinding yerine Binding kullanmanın Design Time sırasında gördüklerinizle ilgili sonuçları olabileceğini unutmayın. Bazı yapılandırmalarda, {Binding RelativeSource ...} kullanılarak bağlanan özellikler tasarımcıda görünmez (yine de çalışma süresi boyunca görünmelerine rağmen), ancak {TemplateBinding ...} kullanmaya geçerseniz bu özellikler değerlendirilir Tasarım Zamanı sırasında.
lfalin

Gelecekteki ziyaretçilere yardımcı olması durumunda ekleyeceğim bir şey, TemplateBinding derleme zamanında değerlendirildiğinden, kullanıcı tanımlı ekli bir özelliğe bağlanmak için TemplateBinding kullanamazsınız. Kullanıcı tanımlı ekli özellikler durumunda, "{Binding RelativeSource = {RelativeSource TemplatedParent} ...}"
MNB

35

TemplateBinding - Normal Ciltleme kullanmaktan daha sınırlayıcı

  • Bağlamadan daha verimli ancak daha az işlevselliğe sahip
  • Yalnızca ControlTemplate'in görsel ağacında çalışır
  • Donduruculardaki özelliklerle çalışmaz
  • ControlTemplate'in Tetikleyicisi içinde çalışmaz
  • Ayar özelliklerinde (ayrıntılı olarak değil) bir kısayol sağlar, örn. {TemplateBinding targetProperty}

Düzenli Ciltleme - TemplateBinding'ın üst sınırlamaları yoktur

  • Ebeveyn Özelliklerine Saygı
  • Açıkça ayarlanmış değerleri silmek için Hedef Değerleri sıfırlar
  • Örnek: <Elips Fill = "{Bağlama RelativeSource = {RelativeSource TemplatedParent}, Yol = Arka Plan}" />

22

Bir şey daha - TemplateBindings değer dönüştürmeye izin vermiyor. Bir Dönüştürücüyü geçmenize izin vermezler ve int'i otomatik olarak örneğin dizeye dönüştürmezler (ki bu bir Bağlama için normaldir).


1
Teşekkürler Miroslav, karşılaştığım sorun buydu, TemplatedParent kullanmaya geçmek sorunu çözdü.
MikeKulls

17

TemplateBinding, TemplatedParent ile Bağlama için bir kısayoldur, ancak Binding sınıfının tüm özelliklerini göstermez, örneğin Binding.Mode'u TemplateBinding'dan kontrol edemezsiniz.


1

TemplateBinding Dondurucu türleri (fırça nesneleri içeren) desteklemediğini düşündüm. Sorunu çözmek için. TemplatedParent kullanılabilir


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.