【问题标题】:Usage DataTrigger in WPF在 WPF 中使用 DataTrigger
【发布时间】:2011-08-17 15:48:49
【问题描述】:

我在 XAML 中定义了一个 TextBox 控件,我想根据其 IsReadOnly 或 IsEnabled 属性为 TextBox 应用不同的背景颜色。我使用 dataTriggers 在颜色之间进行实际切换,如下所示:

<Style x:Key="TextBoxStyle" TargetType="TextBox">
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsEnabled}" Value="True">
            <Setter Property="TextBox.Background" Value="Yellow"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding IsReadOnly}" Value="True">
            <Setter Property="TextBox.Background" Value="Red"/>
        </DataTrigger>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding IsReadOnly}" Value="True"/>
                <Condition Binding="{Binding IsEnabled}" Value="True"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="Background" Value="Green"/>
        </MultiDataTrigger>
    </Style.Triggers>
</Style>

而TextBox的定义如下图:

  <TextBox Name="sourceTextBox"  Margin="5,3,5,3" IsReadOnly="True" Style="{StaticResource TextBoxStyle}" />

但问题是,颜色没有正确应用。

上面的方法有问题吗?

【问题讨论】:

    标签: wpf xaml datatrigger multidatatrigger


    【解决方案1】:

    我认为您只需要将 RelativeSource={RelativeSource Self} 添加到您的绑定中:

    <Style x:Key="TextBoxStyle" TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsEnabled, RelativeSource={RelativeSource Self}}" Value="True">
                <Setter Property="Background" Value="Yellow" />
            </DataTrigger>
            <DataTrigger Binding="{Binding IsReadOnly, RelativeSource={RelativeSource Self}}" Value="True">
                <Setter Property="Background" Value="Red" />
            </DataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding IsReadOnly, RelativeSource={RelativeSource Self}}" Value="True"/>
                    <Condition Binding="{Binding IsEnabled, RelativeSource={RelativeSource Self}}" Value="True"/>
                </MultiDataTrigger.Conditions>
                <Setter Property="Background" Value="Green"/>
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>
    

    但是仍然存在一个问题,我不相信您会看到红色背景,因为其 IsEnabled 属性设置为 False 的 TextBox 在其控件模板中具有内置背景颜色,该背景颜色将优先于您的样式触发器二传手。

    我认为您必须重新定义其控件模板以在禁用 TextBox 时更改背景颜色。

    【讨论】:

      【解决方案2】:

      你把事情复杂化了

      <Style x:Key="TextBoxStyle" TargetType="TextBox">
          <Style.Triggers>
              <Trigger Property="IsEnabled" Value="True">
                  <Setter Property="Background" Value="Yellow"/>
              </Trigger>
              <Trigger Property="IsReadOnly" Value="True">
                  <Setter Property="Background" Value="Red"/>
              </Trigger>
              <MultiTrigger>
                  <MultiTrigger.Conditions>
                      <Condition Property="IsEnabled" Value="True"/>
                      <Condition Property="IsReadOnly" Value="True"/>
                  </MultiTrigger.Conditions>
                  <Setter Property="Background" Value="Green"/>
              </MultiTrigger>
          </Style.Triggers>
      </Style>
      

      【讨论】:

      • 5 年过去了。但是不错。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2011-11-03
      • 2012-04-29
      • 2016-06-18
      • 2012-04-02
      • 2017-12-01
      相关资源
      最近更新 更多