编辑:所以,事实证明这是VM中的代码的问题(令人尴尬地检查一个总是在重构会话之后返回true的属性) - 我有点假设因为那是通常的嫌疑人(至少对我来说),我把数据绑定错了
感谢您的帮助,并为浪费您的时间而道歉。
嗨,我正在尝试将此文本颜色简单地更改为红色或绿色,具体取决于viewmodel中的布尔依赖项属性。触发器是问题所在......我认为?
<TextBlock>
<TextBlock.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding IsNegativeChange}" Value="true">
<Setter Property="TextBlock.Foreground" Value="Red" />
</DataTrigger>
<DataTrigger Binding="{Binding IsNegativeChange}" Value="false">
<Setter Property="TextBlock.Foreground" Value="Green" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} ({1})">
<Binding Path="ReturnedData.Change" />
<Binding Path="ReturnedData.ChangePercentage" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
IsNegativeChange是ViewModel对象本身的成员,因此不需要'ReturnedData'限定。
目前,文本始终显示为绿色。 ViewModel根据输入正确返回true / false ..帮助!有什么东西让我感到愚蠢吗?
[为格式编辑]
编辑,在调试窗口中显示:
BindingExpression:路径= IsNegativeChange;的DataItem = NULL; target元素是'TextBlock'(Name =''); 目标属性为'NoTarget'(类型'对象')
不是由??
设定的目标答案 0 :(得分:1)
触发器看起来很好,Visual Studio中的输出窗口是否显示任何绑定错误?
如果不是,可能会覆盖触发器的值,请参阅有关dependency property value precedence的文章以获取更多信息。如果您在某处明确将值设置为绿色,则触发器将不执行任何操作。
答案 1 :(得分:0)
您可以像这样取消第二个触发器:
<Style>
<Setter Property="TextBlock.Foreground" Value="Red" />
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=DataContext.IsNegativeChange}" Value="false">
<Setter Property="TextBlock.Foreground" Value="Green" />
</DataTrigger>
</Style.Triggers>
</Style>
这并不能解释为什么一个有效,另一个却没有。
答案 2 :(得分:0)
我认为您的问题可能是样式与元素内联。控制台中的Binding错误消息表明绑定目标在您的Style中被遮挡。但是,您提到添加另一个带有绑定的Label元素会显示正确的值。
我还会考虑转换为你风格的已知默认值,而不是两个相反的触发器。
尝试在TextBlock外部定义样式 -
<Grid>
<Grid.Resources>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Setter Property="TextBlock.Foreground" Value="Green" />
<DataTrigger Binding="{Binding IsNegativeChange}" Value="True">
<Setter Property="TextBlock.Foreground" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} ({1})">
<Binding Path="ReturnedData.Change" />
<Binding Path="ReturnedData.ChangePercentage" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Grid>
希望有所帮助!