How to make a text box Visibility=Hidden with a trigger
Asked Answered
O

2

14

I seem to be having a hard time today. All I want to do is make a TextBox hidden of visible based on a bool value databound to the Window its hosted in.

What I have just won't compile and I don't understand why. Please help.

<TextBlock Grid.Column="2" Text="This order will be sent to accounting for approval" 
           Foreground="Red" VerticalAlignment="Center" FontWeight="Bold" Padding="5">
    <TextBlock.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=AllowedToSubmit}" Value="True">
                    <Setter Property="Visibility" Value="Hidden" /> 
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>
Ogg answered 10/3, 2009 at 16:28 Comment(0)
B
24

You need to set the Style.TargetType in order for it to recognize the Visibility property:

<TextBlock Grid.Column="2" VerticalAlignment="Center" FontWeight="Bold" Foreground="Red" Padding="5" Text="This order will be sent to accounting for approval">
    <TextBlock.Style>
        <Style TargetType="{x:Type TextBlock}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=AllowedToSubmit}" Value="True">
                    <Setter Property="Visibility" Value="Hidden"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

Your binding path to AllowedToSubmit probably needs to have ElementName set to the Window's name, as well.

Beano answered 10/3, 2009 at 16:42 Comment(5)
Not necessarily - he might have set a DataContext further up the tree, and AllowedToSubmit is a property on that object.Admittedly
Agreed with Andy. If Russ is using MVVM, he probably has a DataContext to resolve the binding.Moltke
MVVM. I don't need to set the ElementName. Thanks for the tip though. My years of winforms is proving to be pretty worthless in WPF. :)Ogg
Looks like a style within control TargetType could be defaulted to the owner, not sure why MS didn't do this... Any ideas?Bohol
Good call about not needing the ElementName, I'll remove that part of the answer. re: Default TargetType, if the Style were sitting as a resource you'd get the same error, since it could be assigned to anything it needs to know what it will be ahead of time.Beano
A
9

Another option is to bind TextBlock.Visibility directly to the property:

<Window>
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="BoolToVisibility" />
    </Window.Resources>
    <TextBlock Visibility="{Binding Path=AllowedToSubmit, Converter={StaticResource BoolToVisibility}}" />
</Window>

If you want it to work like in your sample, where true hides the TextBlock, then you can write your own converter to convert opposite of the built-in BooleanToVisibilityConverter.

Admittedly answered 10/3, 2009 at 16:51 Comment(2)
This is the most common way to set the visibility in WPF using MVVM. +1Mccrea
Except if the property field changes during the presentation of the view, it won't change visibilityEpilimnion

© 2022 - 2024 — McMap. All rights reserved.