C# WPF数据绑定DataTrigger基于布尔值更改形状颜色

C# WPF数据绑定DataTrigger基于布尔值更改形状颜色,c#,wpf,data-binding,datatrigger,C#,Wpf,Data Binding,Datatrigger,我试图通过数据绑定和数据触发器来改变形状的颜色 但我对WPF和所有的东西还是新手 让我举例说明。这是一个分组框 <GroupBox x:Class="Server.Host.SingleAxisControls" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

我试图通过数据绑定和数据触发器来改变形状的颜色

但我对WPF和所有的东西还是新手

让我举例说明。这是一个分组框

<GroupBox x:Class="Server.Host.SingleAxisControls"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:host="clr-namespace:Server.Host"
         mc:Ignorable="d" 
         d:DesignWidth="200">
    <Grid>
        <StackPanel Orientation="Vertical" Width="180" >
            <host:MyRectangleControl x:Name="MyRectangle" />
            <Button Click="OnButton_Click" Width="80" Margin="20,5,20,5">On</Button>
            <Button Click="OffButton_Click" Width="80">Off</Button>
        </StackPanel>
    </Grid>
</GroupBox>
我不确定哪里出了问题,但当我将test的值从false更改为true时,它似乎没有改变矩形的颜色。

这是一个问题

直接在元素声明中设置DependencyProperty时,此值的优先级高于样式中设置的值

只需在样式中将“填充”特性设置为红色:

<Rectangle  HorizontalAlignment="Center"
          Height="25"
          Margin="0,0,0,0"
          Stroke="Black"
          VerticalAlignment="Center"
          Width="25" 
          >
    <Rectangle.Style>
        <Style TargetType="Rectangle">
            <Setter Property="Fill" Value="Red"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Test,UpdateSourceTrigger=PropertyChanged}"
                             Value="True">
                    <Setter Property="Fill"
                            Value="Green" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Rectangle.Style>
</Rectangle>

另一个有效选项是将转换器写入绑定。它看起来是这样的:

class BooleanToBrushConverter : IValueConverter
    {
        public object Convert(object value, Type targetType,  System.Globalization.CultureInfo culture)
        {
            if ((bool)value)
            {
                return new SolidColorBrush(Colors.Black);
            }
            return new SolidColorBrush(Colors.LightGray);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
<Rectangle  HorizontalAlignment="Center"
              Height="25"
              Margin="0,0,0,0"
              Stroke="Black"
              VerticalAlignment="Center"
              Width="25" 
              Fill="{Binding Test, Converter={StaticResource b2b}}">
(您可以将颜色设置为所需的任何颜色) Xaml看起来是这样的:

class BooleanToBrushConverter : IValueConverter
    {
        public object Convert(object value, Type targetType,  System.Globalization.CultureInfo culture)
        {
            if ((bool)value)
            {
                return new SolidColorBrush(Colors.Black);
            }
            return new SolidColorBrush(Colors.LightGray);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
<Rectangle  HorizontalAlignment="Center"
              Height="25"
              Margin="0,0,0,0"
              Stroke="Black"
              VerticalAlignment="Center"
              Width="25" 
              Fill="{Binding Test, Converter={StaticResource b2b}}">
标记中 然后是参考资料中的

<UserControl.Resources>
    <BooleanToBrushConverter x:Key="b2b" />
</UserControl.Resources>
xlmns:converters="clr-namespace:Project.Converters"