WPF中TemplateBinding和TemplatedParent的使用區別


 {TemplateBinding X}只是編寫{Binding X, RelativeSource={RelativeSource TemplatedParent}}的快捷方式。TemplateBinding等價於{Binding RelativeSource={RelativeSource TemplatedParent}}。

區別:

1.TemplateBinding是在編譯時評估的,而RelativeSource TemplatedParent是在運行時評估的。所以模板Template中的觸發器是在運行中進行判斷的,屬性綁定應該使用TemplatedParent的形式,使用TemplateBinding則會報錯。

             <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type local:ButtonEx}">
                            <Border x:Name="border" Background="{TemplateBinding Background}" 
                                    CornerRadius="{TemplateBinding CornerRadius}" 
                                    BorderBrush="{TemplateBinding BorderBrush}" 
                                    BorderThickness="{TemplateBinding BorderThickness}" 
                                    Width="{TemplateBinding Width}" 
                                    Height="{TemplateBinding Height}" 
                                    SnapsToDevicePixels="True">
                                <TextBlock x:Name="txt" Text="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsMouseOver" Value="True">
                                    <Setter TargetName="border" Property="Background" Value="{Binding MouseOverBackground,RelativeSource= {RelativeSource Mode=TemplatedParent}}"/>
                                    <Setter TargetName="txt" Property="Foreground" Value="{Binding MouseOverForeground,RelativeSource= {RelativeSource Mode=TemplatedParent}}"/>
                                    <Setter TargetName="border" Property="BorderBrush" Value="{Binding MouseOverBorderbrush,RelativeSource= {RelativeSource Mode=TemplatedParent}}"/>
                                </Trigger>
                                <Trigger Property="IsPressed" Value="True">
                                    <Setter TargetName="border" Property="Background" Value="{Binding MousePressedBackground,RelativeSource={RelativeSource TemplatedParent}}"/>
                                    <Setter TargetName="txt" Property="Foreground" Value="{Binding MousePressedForeground,RelativeSource={RelativeSource TemplatedParent}}"/>

                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>

2、TemplateBinding的數據綁定是單向的,從數據源到目標(即從應用Template的控件到Template)。Binding的數據綁定方式是能夠經過Mode設置的,可單向、雙向等。

3、TemplateBinding不能對數據對象進行自動轉換,數據源和目標的數據類型不同時候,需要自己寫轉換器。Binding會對數據源和目標的數據類型進行自動轉換

使用總結:

因為TemplateBinding是在編譯時求值的,所以TemplateBinding的求值速度要快一些,但是如果它認為不存在綁定屬性,它將拋出錯誤。如果您知道該屬性存在,但編譯器不知道該屬性,則可以使用RelativeSource TemplatedParent,因為它是在運行時而不是編譯時求值的。例如模板中的觸發器綁定時必須使用RelativeSource TemplatedParent。

總而言之,請使用TemplateBinding,除非它給您一個錯誤並且您知道該屬性存在,然后使用RelativeSource TemplatedParent。



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM