Как привязать datatrigger в xaml к определяемому кодом свойству зависимостей?
Мой код для окна определяет свойство зависимостей "Active"...
public partial class MainWindow : Window
{
public MainWindow() { InitializeComponent(); }
public bool Active
{
get { return (bool) GetValue(ActiveProperty); }
set { SetValue(ActiveProperty, value); }
}
public static readonly DependencyProperty ActiveProperty =
DependencyProperty.Register("Active", typeof(bool), typeof(MainWindow), new UIPropertyMetadata(false));
}
И затем я привязываюсь к этому свойству, используя два флажка в xaml. Я также хочу изменить заливку прямоугольника на основе этого свойства. Как я могу заставить это работать?
<Window x:Class="WpfTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="350"
Width="525"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<StackPanel>
<CheckBox IsChecked="{Binding Active}" />
<CheckBox IsChecked="{Binding Active}" />
<Rectangle Fill="Gray"
Width="50"
Height="50">
<Rectangle.Style>
<Style TargetType="Rectangle">
<Style.Triggers>
<DataTrigger Binding="{Binding Active}"
Value="True">
<Setter Property="Fill"
Value="Green" />
</DataTrigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
</Rectangle>
</StackPanel>
</Window>
Проверка одного прямоугольника автоматически проверяет другой, но не изменяет цвет прямоугольника : (
2 ответа:
Локально заданные свойства всегда переопределяют свойства набора стилей, поэтому вам нужно удалить локально заданное значение и установить вместо него значение по умолчанию в вашем стиле:
<Rectangle Width="50" Height="50"> <Rectangle.Style> <Style TargetType="Rectangle"> <Setter Property="Fill" Value="Gray" /> <Style.Triggers> <DataTrigger Binding="{Binding Active}" Value="True"> <Setter Property="Fill" Value="Green"/> </DataTrigger> </Style.Triggers> </Style> </Rectangle.Style> </Rectangle>
Как только вы зададите свойство, триггеры, определенные для этого свойства стилем, больше не будут работать. Вы можете определить другой dataTrigger, чтобы изменить фон на ложное значение:
<StackPanel> <CheckBox IsChecked="{Binding Active}"/> <CheckBox IsChecked="{Binding Active}"/> <Rectangle Width="50" Height="50"> <Rectangle.Style> <Style TargetType="Rectangle"> <Style.Triggers> <DataTrigger Binding="{Binding Active}" Value="True"> <Setter Property="Fill" Value="Green"/> </DataTrigger> <DataTrigger Binding="{Binding Active}" Value="false"> <Setter Property="Fill" Value="Gray"/> </DataTrigger> </Style.Triggers> </Style> </Rectangle.Style> </Rectangle> </StackPanel>