Was ist der Unterschied zwischen diesen beiden Bindungen:
<ControlTemplate TargetType="{x:Type Button}">
<Border BorderBrush="{TemplateBinding Property=Background}">
<ContentPresenter />
</Border>
</ControlTemplate>
und
<ControlTemplate TargetType="{x:Type Button}">
<Border BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}">
<ContentPresenter />
</Border>
</ControlTemplate>
?
wpf
relativesource
templatebinding
PaN1C_Showt1Me
quelle
quelle
Antworten:
TemplateBinding ist nicht ganz dasselbe. MSDN-Dokumente werden häufig von Personen geschrieben, die einsilbige SDEs zu Softwarefunktionen testen müssen, sodass die Nuancen nicht ganz richtig sind.
TemplateBindings werden zur Kompilierungszeit anhand des in der Steuerungsvorlage angegebenen Typs ausgewertet. Dies ermöglicht eine viel schnellere Instanziierung kompilierter Vorlagen. Fummeln Sie einfach den Namen in einer Vorlagenbindung und Sie werden sehen, dass der Compiler ihn markiert.
Das Bindungsmarkup wird zur Laufzeit aufgelöst. Während die Ausführung langsamer ist, werden durch die Bindung Eigenschaftsnamen aufgelöst, die für den von der Vorlage deklarierten Typ nicht sichtbar sind. Mit langsamer werde ich darauf hinweisen, dass es sich um einen Verwandten handelt, da der Bindungsvorgang nur sehr wenig von der CPU der Anwendung beansprucht. Wenn Sie Steuerungsvorlagen mit hoher Geschwindigkeit herumsprengen, werden Sie es möglicherweise bemerken.
Verwenden Sie die TemplateBinding aus praktischen Gründen, wenn Sie die Bindung nicht fürchten können.
quelle
TemplateBinding - Einschränkender als die Verwendung der regulären Bindung
Regelmäßige Bindung - Hat keine der oben genannten Einschränkungen für TemplateBinding
quelle
Noch etwas - TemplateBindings erlauben keine Wertkonvertierung. Sie erlauben Ihnen nicht, einen Konverter zu übergeben und konvertieren beispielsweise nicht automatisch int in einen String (was für eine Bindung normal ist).
quelle
TemplateBinding ist eine Abkürzung für Binding with TemplatedParent, stellt jedoch nicht alle Funktionen der Binding-Klasse zur Verfügung. Beispielsweise können Sie Binding.Mode nicht über TemplateBinding steuern.
quelle
Ich dachte, TemplateBinding unterstützt keine Freezable-Typen (einschließlich Pinselobjekte). Um das Problem zu umgehen. Man kann TemplatedParent verwenden
quelle
Sie werden auf ähnliche Weise verwendet, weisen jedoch einige Unterschiede auf. Hier ist ein Link zur TemplateBinding-Dokumentation: http://msdn.microsoft.com/en-us/library/ms742882.aspx
quelle