1

我有一个用于边框背景的 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 ,但不相等)。

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

谢谢,

RDV

4

1 回答 1

2

是的,Brushes.Red是一个SolidColorBrush. 不是颜色,是刷子。混淆源于将 XAML 中的字符串“Red”隐式转换为 Brush 对象。但是一个新的SolidColorBrush实例Color也等于#FFFF0000a 将是一个不同的实例SolidColorBrush,并且它们不会彼此“相等”。

但你不在乎它是哪个画笔实例;你关心颜色。所以比较颜色。(Brushes.Red.Color == Colors.Red) == true. Color是值类型,而不是引用类型,因此两个等价的将被视为相等。

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

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

<DataTrigger 
    Binding="{Binding Path=Background.Color, RelativeSource={RelativeSource Self}}" 
    Value="Red">
于 2016-09-19T23:12:00.237 回答