Использование DataTrigger в WPF

#wpf #xaml #datatrigger #multidatatrigger

#wpf #xaml #datatrigger #multidatatrigger

Вопрос:

У меня есть TextBox элемент управления, определенный в XAML, и я хочу применить к нему разные цвета фона TextBox на основе его свойств IsReadOnly или IsEnabled. Я использовал 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 Name="sourceTextBox"  Margin="5,3,5,3" IsReadOnly="True" Style="{StaticResource TextBoxStyle}" />
  

Но проблема в том, что цвета не применяются должным образом.

Есть ли какие-либо проблемы с вышеупомянутым подходом?

Ответ №1:

Вы излишне все усложняете

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

Комментарии:

1. прошло 5 лет. Но приятно. Спасибо.

Ответ №2:

Я думаю, вам просто нужно добавить 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, имеет встроенный цвет фона в свой шаблон управления, который будет иметь приоритет над настройщиком триггера вашего стиля.

Я думаю, вам пришлось бы переопределить его шаблон управления, чтобы изменить цвет фона, когда текстовое поле отключено.