如何获得触发器以根据 DataContext 属性更改 TextBlock 的颜色?

Posted

技术标签:

【中文标题】如何获得触发器以根据 DataContext 属性更改 TextBlock 的颜色?【英文标题】:How can I get a trigger to change the color of a TextBlock based on a DataContext Property? 【发布时间】:2010-10-29 05:25:18 【问题描述】:

为什么下面的代码会出现运行时错误:

Triggers 集合的成员必须是 EventTrigger 类型

但 EventTrigger 元素没有 Binding 属性。

那么如何根据DataContext属性改变TextBlock的颜色呢?

XAML:

<Window x:Class="TestTrigger123345.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel HorizontalAlignment="Left">
        <TextBlock Text="Binding Status">
            <TextBlock.Triggers>
                <DataTrigger Binding="Binding Status" Value="off">
                    <Setter Property="TextBlock.Background" Value="Red"/>
                </DataTrigger>
            </TextBlock.Triggers>
        </TextBlock>
    </StackPanel>
</Window>

代码:

namespace TestTriggers

    public partial class Window1 : Window
    
        public Window1()
        
            InitializeComponent();
            DataContext = this;
            Status = "off";
        

        public string Status  get; set;     
    

【问题讨论】:

【参考方案1】:

你可以用一种风格来做:

<TextBlock Text="Binding Status">
    <TextBlock.Style>
        <Style TargetType="x:Type TextBlock">
            <Style.Triggers>
                <DataTrigger Binding="Binding Status" Value="off">
                    <Setter Property="Background" Value="Red"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

【讨论】:

【参考方案2】:

有一个错字,因为您没有关闭 Style.Triggers。我发现我需要使用属性 TextBlock.Background。谢谢,你让我找到了解决方案。

    <TextBlock.Style>
        <Style TargetType="x:Type TextBlock">
            <Style.Triggers>
                <DataTrigger Binding="Binding Status" Value="off">
                    <Setter Property="TextBlock.Background" Value="Red"/>
                 </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>

【讨论】:

【参考方案3】:

那是因为你只能直接在 Trigger 属性上设置事件触发器..

用一种风格来实现你想要的:

<Style x:Key="Triggers" TargetType="TextBlock">
    <Style.Triggers>
        <DataTrigger Binding="Binding Status" Value="off">
            <Setter Property="TextBlock.Background" Value="Red"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

以下对象具有可包含所列触发器类型的触发器集合:

FrameworkElement     Style, ControlTemplate, DataTemplate
----------------     ------------------------------------
EventTrigger         EventTrigger
                     Trigger or MultiTrigger
                     DataTrigger or MultiDataTrigger

【讨论】:

以上是关于如何获得触发器以根据 DataContext 属性更改 TextBlock 的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

C# WPF 数据绑定DataContext;Window_Loaded时进行过数据绑定,指定DataContext;触发另一事件?

如何使用 DataContext 属性在 XAML 中的窗口上设置 ViewModel?

如何使用DataContext属性在XAML中的窗口上设置ViewModel?

如果底层 DataContext 为空,如何隐藏控件?

UWP 数据绑定:如何将按钮命令设置为 DataTemplate 中的父 DataContext

绑定从方法获得的属性,返回对象