WPF中的用法DataTrigger

时间:2011-05-03 11:45:02

标签: wpf xaml datatrigger multidatatrigger

我在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}" />

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

上述方法有问题吗?

2 个答案:

答案 0 :(得分:5)

你是不必要的复杂事情

答案 1 :(得分: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属性设置为False的TextBox在其控件模板中具有内置的背景颜色,优先于你的样式的触发器设定器。

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