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) == true
。 Color
是值类型,不是引用类型,所以两个等价的 values 会被认为是相等的。
<DataTrigger
Binding="{Binding Background.Color, RelativeSource={RelativeSource Self}}"
Value="Red">
请注意 Background
不是 DataContext
的 属性。那是第二个不适用于您的代码的事情。您需要明确告诉 Binding
不要查看 DataContext
,而是查看控件本身,以找到 Path
中引用的 属性。 RelativeSource={RelativeSource Self}
这样做。 "Background.Color"
是 Binding
的 Path
参数。 Path
是默认值,因此您不必明确命名它。但你可以:
<DataTrigger
Binding="{Binding Path=Background.Color, RelativeSource={RelativeSource Self}}"
Value="Red">
我有一个用于边框背景的 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) == true
。 Color
是值类型,不是引用类型,所以两个等价的 values 会被认为是相等的。
<DataTrigger
Binding="{Binding Background.Color, RelativeSource={RelativeSource Self}}"
Value="Red">
请注意 Background
不是 DataContext
的 属性。那是第二个不适用于您的代码的事情。您需要明确告诉 Binding
不要查看 DataContext
,而是查看控件本身,以找到 Path
中引用的 属性。 RelativeSource={RelativeSource Self}
这样做。 "Background.Color"
是 Binding
的 Path
参数。 Path
是默认值,因此您不必明确命名它。但你可以:
<DataTrigger
Binding="{Binding Path=Background.Color, RelativeSource={RelativeSource Self}}"
Value="Red">