【问题标题】:How can I get a trigger to change the color of a TextBlock based on a DataContext Property?如何获得触发器以根据 DataContext 属性更改 TextBlock 的颜色?
【发布时间】: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; }    
    }
}

【问题讨论】:

    标签: c# wpf xaml triggers styles


    【解决方案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
        

        【讨论】:

          猜你喜欢
          • 2018-03-13
          • 2012-12-04
          • 2022-01-13
          • 2012-12-07
          • 2010-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-11
          相关资源
          最近更新 更多