views:

769

answers:

2

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>
+3  A: 

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.

Robert Macnee
Not necessarily - he might have set a DataContext further up the tree, and AllowedToSubmit is a property on that object.
Andy
Agreed with Andy. If Russ is using MVVM, he probably has a DataContext to resolve the binding.
KP Adrian
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. :)
Russ
Looks like a style within control TargetType could be defaulted to the owner, not sure why MS didn't do this... Any ideas?
Sergey Aldoukhov
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.
Robert Macnee
A: 

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.

Andy