2011-05-03 95 views
1

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

<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 Name="sourceTextBox" Margin="5,3,5,3" IsReadOnly="True" Style="{StaticResource TextBoxStyle}" /> 

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

上述方法有问题吗?

回答

3

我想你需要只需要添加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属性一个TextBox设置为False在其控制模板中内置背景颜色,该模板将优先于您的样式触发器的设置者。

我想你不得不重新定义它的控件模板来改变TextBox被禁用时的背景颜色。

5

您unecessarily事情复杂

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

5年。但是不错。谢谢。 – 2016-05-10 09:58:39