Jaka jest różnica między tymi dwoma wiązaniami:
<ControlTemplate TargetType="{x:Type Button}">
<Border BorderBrush="{TemplateBinding Property=Background}">
<ContentPresenter />
</Border>
</ControlTemplate>
i
<ControlTemplate TargetType="{x:Type Button}">
<Border BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}">
<ContentPresenter />
</Border>
</ControlTemplate>
?
wpf
relativesource
templatebinding
PaN1C_Showt1Me
źródło
źródło
Odpowiedzi:
TemplateBinding to nie to samo. Dokumenty MSDN są często pisane przez ludzi, którzy muszą sprawdzać monosylabowe SDE dotyczące funkcji oprogramowania, więc niuanse nie są do końca poprawne.
TemplateBindings są oceniane w czasie kompilacji względem typu określonego w szablonie kontrolnym. Pozwala to na znacznie szybsze tworzenie instancji skompilowanych szablonów. Po prostu znajdź nazwę w powiązaniu szablonu, a zobaczysz, że kompilator oznaczy ją flagą.
Znacznik powiązania jest rozpoznawany w czasie wykonywania. Chociaż wolniejsze do wykonania, powiązanie rozwiąże nazwy właściwości, które nie są widoczne w typie zadeklarowanym przez szablon. Wolniej wskażę, że jest to rodzaj względny, ponieważ operacja wiązania zajmuje bardzo mało procesora aplikacji. Jeśli strzelałeś z szablonów kontrolnych z dużą prędkością, możesz to zauważyć.
W ramach praktyki używaj TemplateBinding, kiedy możesz, ale nie obawiaj się Binding.
źródło
TemplateBinding - bardziej ograniczające niż używanie zwykłego Binding
Zwykłe wiązanie - nie ma powyższych ograniczeń TemplateBinding
źródło
Jeszcze jedno - TemplateBindings nie pozwalają na konwersję wartości. Nie pozwalają na przekazanie konwertera i nie konwertują na przykład automatycznie int na string (co jest normalne dla Binding).
źródło
TemplateBinding to skrót dla Binding with TemplatedParent, ale nie ujawnia wszystkich możliwości klasy Binding, na przykład nie można kontrolować Binding.Mode z TemplateBinding.
źródło
Myślałem, że TemplateBinding nie obsługuje typów Freezable (w tym obiektów pędzla). Aby obejść problem. Można skorzystać z TemplatedParent
źródło
Są używane w podobny sposób, ale mają kilka różnic. Oto łącze do dokumentacji TemplateBinding: http://msdn.microsoft.com/en-us/library/ms742882.aspx
źródło