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>
From stackoverflow
-
You need to set the
Style.TargetType
in order for it to recognize theVisibility
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 toAllowedToSubmit
probably needs to haveElementName
set to theWindow
's name, as well.Andy : Not necessarily - he might have set a DataContext further up the tree, and AllowedToSubmit is a property on that object.KP Adrian : Agreed with Andy. If Russ is using MVVM, he probably has a DataContext to resolve the binding.Russ : 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. :)Sergey Aldoukhov : Looks like a style within control TargetType could be defaulted to the owner, not sure why MS didn't do this... Any ideas?Robert Macnee : 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. -
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-inBooleanToVisibilityConverter
.
0 comments:
Post a Comment