开发者

WPF DataTrigger / DataBinding failing?

EDIT: So, it turns out that it was a problem with the code in the VM (embarrassingly enough checking on a property that always returned true [after a refactoring session] ) - I'd kind of assumed that I'd buggered up the databinding as that's the usual suspect (for me at least)

Thank you for all the help, and apologies for wasting your time.

Hi, I'm trying to get this to simply change text colour to either Red or Green depending on a boolean Dependency Property in the viewmodel. The triggers are where the problem is... I think?

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

The IsNegativeChange is a member of the ViewModel objec开发者_运维知识库t itself and so it doesn't need the 'ReturnedData' qualification.

As it stands, the text always appears as green. The ViewModel is correctly returning true/false depending on input.. Help! Is there something stupid I'm missing?

[edited for formatting]

Edit, in the debug window it says:

BindingExpression:Path=IsNegativeChange; DataItem=null; target element is 'TextBlock' (Name=''); target property is 'NoTarget' (type 'Object')

Isn't the target set by the ??


The triggers look fine to me, does the output window in Visual Studio show any binding errors?

If not maybe this is a case where the value of the trigger is overwritten, see this article about dependency property value precedence for more information. If you set the value explicitly to green somewhere the trigger will not do anything.


You can probably do away with the second trigger like so:

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

That doesn't explain why one works and the other doesn't though.


I think your problem might be having the Style inline with the element. The Binding error message in your Console indicates that the binding target is being obscured inside your Style. However, you mention that adding another Label element with a binding shows the correct value.

I would also consider converting to a known default in your style, instead of two opposing triggers.

Try defining the style outside the 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>

Hope that helps!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜