数据触发器与TextBox一起使用但不能与TextBlock一起使用?

时间:2013-06-08 20:45:29

标签: c# wpf xaml datatrigger

我有一些DatTriggerListView项设置文字颜色。如果我将TextBox用作ItemTemplate作为ListView,则效果非常好。但如果我使用TextBlock,它就无效。

此代码:

<Style TargetType="TextBox">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Level,Mode=OneWay}"
                     Value="{x:Static Common:LoggingLevel.Error}">
            <Setter Property="Foreground"
                    Value="Red" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Level,Mode=OneWay}"
                     Value="{x:Static Common:LoggingLevel.Warning}">
            <Setter Property="Foreground"
                    Value="Orange" />
        </DataTrigger>
    </Style.Triggers>
</Style>

...

<ListView ItemsSource="{Binding Entries}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Text,Mode=OneWay}" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

生成正确颜色的消息列表。

这段代码:

<Style TargetType="TextBlock">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Level,Mode=OneWay}"
                     Value="{x:Static Common:LoggingLevel.Error}">
            <Setter Property="Foreground"
                    Value="Red" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Level,Mode=OneWay}"
                     Value="{x:Static Common:LoggingLevel.Warning}">
            <Setter Property="Foreground"
                    Value="Orange" />
        </DataTrigger>
    </Style.Triggers>
</Style>

...

<ListView ItemsSource="{Binding Entries}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Text,Mode=OneWay}" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

使用默认的黑色前景色渲染所有消息。

2 个答案:

答案 0 :(得分:4)

隐式样式在模板中应用于从System.Windows.Controls.Control继承的元素,而TextBlock直接从FrameworkElement继承的元素将不适用。为了使其有效,您必须提供Style x:Key并明确指定样式TextBlock或在TextBlock中定义您的样式

更新:
为了涵盖这个主题,我还应该提一下,有一种方法可以将隐式Style应用于所有TextBlocks。如果您将其放在Application.Resources中,它将适用于整个应用程序中的所有TextBlocks。在这种情况下,它会导致一些主要的性能问题和可能的其他错误,这可能是微软决定保护这些基本元素不会意外地使用复杂的隐式样式的原因。并非所有人都意识到,您在Window中看到的每一段文字基本上都是TextBlock

答案 1 :(得分:0)

提供Style的密钥并将其应用于TextBlock,如下所示:

<Style TargetType="TextBlock" x:Key="txtID">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Level,Mode=OneWay}" Value="{x:Static Common:LoggingLevel.Error}">
            <Setter Property="Foreground" Value="Red" />
        </DataTrigger>

        <DataTrigger Binding="{Binding Level,Mode=OneWay}" Value="{x:StaticCommon:LoggingLevel.Warning}">
            <Setter Property="Foreground" Value="Orange" />
        </DataTrigger>
    </Style.Triggers>
</Style>

<ListView ItemsSource="{Binding Entries}">
     <ListView.ItemTemplate>
         <DataTemplate>
             <TextBlock Text="{Binding Text,Mode=OneWay}" Style="{DynamicResource txtID}"/>
         </DataTemplate>
     </ListView.ItemTemplate>
</ListView>