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