刷MVVM绑定不提供命名颜色

时间:2016-09-19 22:54:12

标签: wpf mvvm datatrigger brushes

我有一个用于边框背景的MVVM绑定,其中我从String文件中读取文件中的颜色名称,并使用代码将它们转换为Brush:

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

Background是在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

1 个答案:

答案 0 :(得分:1)

是的,Brushes.RedSolidColorBrush。不是颜色,刷子。混淆源于将XAML中的字符串&#34; Red&#34;隐式转换为Brush对象。但是,SolidColorBrush Color实例也等于#FFFF0000的{​​{1}}实例将是SolidColorBrush的不同实例,并且他们不会成为&#34;等于&#34;彼此。

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

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

请注意Background不是DataContext的属性。这是第二件与您的代码无关的事情。您需要明确告诉Binding不要查看DataContext,而是在控件本身,找到Path中引用的属性。 RelativeSource={RelativeSource Self}这样做。 "Background.Color"Path的{​​{1}}参数。 Binding是默认设置,因此您无需明确命名。但你可以:

Path