C# 数据触发器可用于TextBox,但不可用于TextBlock?

C# 数据触发器可用于TextBox,但不可用于TextBlock?,c#,wpf,xaml,datatrigger,C#,Wpf,Xaml,Datatrigger,我有一些DatTriggers设置ListView项目的文本颜色。如果我将TextBox用作ItemTemplate用于列表视图,它将非常有效。但是如果我使用TextBlock,它就不起作用了 此代码: <Style TargetType="TextBox"> <Style.Triggers> <DataTrigger Binding="{Binding Level,Mode=OneWay}" Val

我有一些
DatTrigger
s设置
ListView
项目的文本颜色。如果我将
TextBox
用作
ItemTemplate
用于
列表视图
,它将非常有效。但是如果我使用
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>

...

以默认的黑色前景色呈现所有邮件。

隐式样式在模板中应用于继承自
System.Windows.Controls.Control
的元素,并且由于
TextBlock
直接继承自
FrameworkElement
,因此不会应用。要使其正常工作,您必须给出
样式
x:Key
,并将样式显式分配给
文本块
,或在
文本块
中定义样式
更新:
为了涵盖本主题,我还应该提到,有一种方法可以将隐式
样式
应用于所有
文本块
。如果您将它放在
Application.Resources
中,它将应用于整个应用程序中的所有
TextBlocks
。在这种情况下,它将导致一些主要的性能问题和潜在的其他错误,这可能就是为什么Microsoft决定保护这些基本元素,使其不会意外地使用复杂的隐式样式。并非所有人都意识到,基本上,您在
窗口中看到的每一段文本最终都会成为
TextBlock
隐式样式应用于模板中继承自
System.Windows.Controls.Control
的元素,因为
TextBlock
直接继承自
FrameworkElement
它不适用。要使其正常工作,您必须给出
样式
x:Key
,并将样式显式分配给
文本块
,或在
文本块
中定义样式
更新:
为了涵盖本主题,我还应该提到,有一种方法可以将隐式
样式
应用于所有
文本块
。如果您将它放在
Application.Resources
中,它将应用于整个应用程序中的所有
TextBlocks
。在这种情况下,它将导致一些主要的性能问题和潜在的其他错误,这可能就是为什么Microsoft决定保护这些基本元素,使其不会意外地使用复杂的隐式样式。并非所有人都意识到,您在
窗口中看到的每一段文本基本上都以
TextBlock
结尾,提供
样式的键,并将其应用于
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>

提供
样式的键
,并将其与
文本块一起应用,如下所示:

<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>