2011-03-29 102 views
3

编辑:所以,事实证明,这是在VM中的代码问题(令人尴尬足够的检查一个属性,总是返回true [重构会话之后]) - 我会认为我会捣毁数据绑定,因为这是通常的嫌疑人(至少对我来说)
谢谢你的所有帮助,并道歉浪费你的时间。
WPF DataTrigger/DataBinding失败?

嗨,我试图让这只是改变文本颜色为红色或绿色取决于视图模型中的布尔依赖项属性。触发器是问题所在......我想?

<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是视图模型对象本身的成员,并且因此它不需要“ReturnedData”资格。

就目前而言,文字总是显示为绿色。 ViewModel根据输入正确地返回true/false ..帮助!我错过了什么愚蠢的东西吗?

[编辑用于格式化]

编辑,在调试窗口中,它说:

BindingExpression:路径= IsNegativeChange;的DataItem = NULL;目标元素是'TextBlock'(Name =''); target property is'NoTarget'(type'Object')

是不是由?

+0

您的视图模型是否实现INotifyPropertyChanged? – CodeNaked 2011-03-29 15:27:32

+0

不,但它是一个依赖属性,所以我假设变更通知已经处理完毕...? – 2011-03-29 15:29:08

+0

我应该补充说,所有其他属性工作正常。 – 2011-03-29 15:29:58

回答

1

触发器看起来不错,Visual Studio中的输出窗口是否显示任何绑定错误?

如果不是这种情况,触发器的值被覆盖,请参阅有关dependency property value precedence的文章以获取更多信息。如果您将该值显式设置为绿色,触发器将不会执行任何操作。

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> 

这并不能解释为什么一个作品和其他没有,但。

+0

我试过了 - 没有工作:( – 2011-03-29 15:42:41

+0

这听起来像是非常接近解决方案,有时价值优先可能会非常棘手 – rrhartjr 2011-03-29 15:43:47

+0

@Mark - 更新了使用RelativeSource并直接链接到DataContext的答案,除此之外, d可能不得不发布您的视图模型的代码 – CodeNaked 2011-03-29 15:49:59

0

我认为你的问题可能是与元素内联样式。控制台中的绑定错误消息表明绑定目标在您的样式中被遮挡。但是,您提到使用绑定添加另一个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> 

希望帮助!

+0

Fyi,您提交了相同的答案两次 – CodeNaked 2011-03-29 15:55:51

+0

谢谢,副本已被编辑和标记 – rrhartjr 2011-03-29 15:58:21