Brush MVVM Binding 不给命名颜色

Brush MVVM Binding does not give named color

我有一个用于边框背景的 MVVM 绑定,在其中我从字符串格式的文件中读取颜色名称并使用代码将它们转换为画笔:

Brush b1 = new SolidColorBrush((Color)ColorConverter.ConvertFromString("Red");
myItem.Background = b1;

背景是 属性 在 ViewModel 中定义为:

public Brush Background
{
    get { return _background; }
    set
    {
        this._background = value;
        RaisePropertyChanged("Background");
    }
}

并且在 XAML 中访问为:

<Border Background="{Binding Background}">
    <Border.Style>
        <Style TargetType="{x:Type Border}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Background}" Value="Red">
                    <Setter Property="Height" Value="40"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
</Border>

边框颜色正确 - 没有问题。

问题是 DataTrigger 从未被触发,因为当我在 set 方法中看到 this._background 的值时,它是“#FFFF0000”并且不等于 Brushes.Red(我尝试转换值到 SolidColorBrush,然后与 Brushes.Red 进行比较,但不相等。

我做错了什么?我该怎么做才能确保我从文件中读取的颜色名称正确转换为画笔。* 以便我的 DataTrigger 正常工作。

谢谢,

RDV

是的,Brushes.Red 是一个 SolidColorBrush。不是颜色,是画笔。混淆来自 XAML 中的字符串 "Red" 到 Brush 对象的隐式转换。但是 Color 也等于 #FFFF0000 的新 SolidColorBrush 实例将是 SolidColorBrush 的不同实例,它们不会 "equal"另一个。

但是你不关心它是哪个画笔实例;你关心颜色。所以比较颜色。 (Brushes.Red.Color == Colors.Red) == trueColor 是值类型,不是引用类型,所以两个等价的 values 会被认为是相等的。

<DataTrigger 
    Binding="{Binding Background.Color, RelativeSource={RelativeSource Self}}" 
    Value="Red">

请注意 Background 不是 DataContext 的 属性。那是第二个不适用于您的代码的事情。您需要明确告诉 Binding 不要查看 DataContext,而是查看控件本身,以找到 Path 中引用的 属性。 RelativeSource={RelativeSource Self} 这样做。 "Background.Color"BindingPath 参数。 Path 是默认值,因此您不必明确命名它。但你可以:

<DataTrigger 
    Binding="{Binding Path=Background.Color, RelativeSource={RelativeSource Self}}" 
    Value="Red">