如何使用触发器将文本框的可见性设置为隐藏

14

今天我似乎有些困难。我只想根据绑定到其所在窗口的bool值,使TextBox隐藏或显示。

我的代码无法编译,我不明白为什么。请帮帮我。

<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>
2个回答

24

为了使Visibility属性被识别,您需要设置Style.TargetType

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

你绑定到 AllowedToSubmit 的路径可能需要将 ElementName 设置为 Window 的名称。


不一定 - 他可能已经在树的更高层设置了DataContext,并且AllowedToSubmit是该对象上的一个属性。 - Andy
同意安迪的观点。如果Russ正在使用MVVM,他可能有一个DataContext来解决绑定。 - Adrian
MVVM。我不需要设置ElementName。谢谢提示。尽管如此,我的多年WinForms经验在WPF中似乎毫无用处。 :) - Russ
看起来控件TargetType内的样式可以默认为所有者,不确定为什么微软没有这样做...有什么想法吗? - Sergey Aldoukhov
关于不需要ElementName的好建议,我会将答案中的那部分删除。关于默认的TargetType,如果Style作为资源存在,你会得到相同的错误,因为它可以被分配给任何需要提前知道它将是什么的东西。 - Robert Macnee

9
另一种选择是直接将TextBlock.Visibility属性绑定到属性:
<Window>
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="BoolToVisibility" />
    </Window.Resources>
    <TextBlock Visibility="{Binding Path=AllowedToSubmit, Converter={StaticResource BoolToVisibility}}" />
</Window>

如果您希望它像您的示例一样工作,其中true会隐藏TextBlock,那么您可以编写自己的转换器来实现与内置的BooleanToVisibilityConverter相反的转换。

这是使用MVVM在WPF中设置可见性的最常见方法。+1 - Michi-2142
除非在视图呈现过程中更改属性字段,否则它不会改变可见性。 - MwBakker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接