gpt4 book ai didi

wpf - 刷 MVVM 绑定(bind)不给命名颜色

转载 作者:行者123 更新时间:2023-12-03 10:26:51 28 4
gpt4 key购买 nike

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

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

最佳答案

是的,Brushes.RedSolidColorBrush .不是颜色,是刷子。混淆源于将 XAML 中的字符串“Red”隐式转换为 Brush 对象。但是一个新的SolidColorBrush带有 Color 的实例这也等于 #FFFF0000将是 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 Binding 的参数. Path是默认值,因此您不必显式命名它。但你可以:
<DataTrigger 
Binding="{Binding Path=Background.Color, RelativeSource={RelativeSource Self}}"
Value="Red">

关于wpf - 刷 MVVM 绑定(bind)不给命名颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39583263/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com