WPF DataTrigger / DataBinding失败了吗?

时间:2011-03-29 15:23:24

标签: c# wpf dependency-properties datatrigger

编辑:所以,事实证明这是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'(类型'对象')

不是由??

设定的目标

3 个答案:

答案 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>

希望有所帮助!