我有一个用于边框背景的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
答案 0 :(得分:1)
是的,Brushes.Red
是SolidColorBrush
。不是颜色,刷子。混淆源于将XAML中的字符串&#34; Red&#34;隐式转换为Brush对象。但是,SolidColorBrush
Color
实例也等于#FFFF0000
的{{1}}实例将是SolidColorBrush
的不同实例,并且他们不会成为&#34;等于&#34;彼此。
但你不关心它是哪个画笔实例;你关心的颜色。所以比较颜色。 (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
的{{1}}参数。 Binding
是默认设置,因此您无需明确命名。但你可以:
Path