为什么样式targettype必须重新绑定回原始属性?

时间:2017-02-15 05:49:02

标签: wpf targettype

我指的是数据触发器

上的代码块here
<Window x:Class="WpfTutorialSamples.Styles.StyleDataTriggerSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="StyleDataTriggerSample" Height="200" Width="200">
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <CheckBox Name="cbSample" Content="Hello, world?" />
        <TextBlock HorizontalAlignment="Center" Margin="0,20,0,0" FontSize="48">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Setter Property="Text" Value="No" />
                    <Setter Property="Foreground" Value="Red" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=cbSample, Path=IsChecked}" Value="True">
                            <Setter Property="Text" Value="Yes!" />
                            <Setter Property="Foreground" Value="Green" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </StackPanel>
</Window>

对我来说,从编程语言设计的角度来看,行<Style TargetType="TextBlock">完全没必要,因为它已经嵌套在<TextBlock>中,所以当然应该将任何setter属性应用于{ {1}}类型。那么为什么需要行TextBlock

<Style TargetType="TextBlock">以外,<Style TargetType>可以是其他类型吗?

2 个答案:

答案 0 :(得分:2)

您可以使用派生自的任何类TextBlock(例如FrameworkElement)。

例如,如果您实现自己的CustomizedTextBlock,则可以在项目中使用为TextBlock定义的样式。

您可以找到此here的示例。

答案 1 :(得分:1)

  

那么为什么需要这条线?

Style可以定义为资源,即不是内联的,如果没有指定TargetType,XAML解析器应该如何解析它并设置由安装者?它不可能。或者至少它没有。

仅仅因为你可以定义Style内联,你仍然在创建一个完全相同的类的实例,可以用作(全局)资源,然后设置{{1确实是必需的。

  

可以是TextBlock以外的其他类型吗?

不,除了源自TargetType的类型。如果指定另一种类型,则在解析BAML(已编译的XAML)时将在运行时获得异常。