首页 > 解决方案 > 尝试获取 Text.IsEmpty 或 Text.IsNullOrEmpty 属性的数据触发器

问题描述

我正在为我的文本输入创建一个基本样式,这些将有一个占位符。我正在尝试绑定该Text.IsEmpty属性,但它不存在。所以我尝试了以下

<Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Border BorderBrush="{TemplateBinding BorderBrush}" 
                            BorderThickness="{TemplateBinding BorderThickness}" 
                            Background="{TemplateBinding Background}"
                            CornerRadius="{TemplateBinding Border.CornerRadius}">

                        <Grid>
                            <TextBlock x:Name="Placeholder" Visibility="Visible" Text="{TemplateBinding Tag}"></TextBlock>
                            <ScrollViewer Background="Transparent" Margin="0" x:Name="PART_ContentHost"/>
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding ElementName=PART_ContentHost,Path=IsFocused}" Value="False" />
                                <Condition Binding="{Binding ElementName=PART_ContentHost, Path=Text.IsEmpty}" Value="True" />
                        </MultiDataTrigger.Conditions>
                            <Setter TargetName="Placeholder" Property="Visibility" Value="Collapsed"/>
                        </MultiDataTrigger>

                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>

为简单起见,我只会在此处为我尝试过的所有其他内容编写多触发器。

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
         <Condition Binding="{Binding  RelativeSource={x:Static RelativeSource.Self},Path=IsFocused}" Value="False" />
         <Condition Binding="{Binding RelativeSource={x:Static RelativeSource.Self},Path=Text.IsEmpty}" Value="True" />
         </MultiDataTrigger.Conditions>
         <Setter TargetName="Placeholder" Property="Visibility" Value="Collapsed"/>
</MultiDataTrigger>

两者都不起作用,我不是很深入使用RelativeSource所以也许我使用了错误的源属性?任何人都可以建议我应该根据我的条件绑定什么。

应该没有文本,空格算作没有文本。

或者,如果输入聚焦,占位符就会消失。

标签: wpfmultidatatrigger

解决方案


我看到的第一个问题是你的逻辑被颠倒了。您的触发器表示,如果控件未聚焦且文本为空,则隐藏占位符。(我认为这不是你想要的)

我看到的第二个问题是您在控制模板中使用数据触发器。在控件模板中,您可以只使用普通触发器,因为您可以直接访问所有元素。

在下面的示例中,我Collapsed默认使用占位符。如果其中一个触发器触发,那么它会将其设置为Visible. 我添加了一个额外的触发器来处理null.

我也在使用IsKeyboardFocusWithin它往往更可靠。

这是一个工作示例:

<TextBox
    Width="200"
    Height="24"
    Tag="Enter something...">
    <TextBox.Style>
        <Style BasedOn="{StaticResource {x:Type TextBox}}" TargetType="{x:Type TextBox}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Border
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            CornerRadius="{TemplateBinding Border.CornerRadius}">
                            <Grid>
                                <TextBlock x:Name="Placeholder"
                                    Text="{TemplateBinding Tag}"
                                    Visibility="Collapsed" />
                                <ScrollViewer x:Name="PART_ContentHost"
                                    Margin="0"
                                    Background="Transparent" />
                            </Grid>
                        </Border>
                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsKeyboardFocusWithin" Value="False" />
                                    <Condition Property="Text" Value="{x:Static sys:String.Empty}" />
                                </MultiTrigger.Conditions>
                                <Setter TargetName="Placeholder" Property="Visibility" Value="Visible" />
                            </MultiTrigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsKeyboardFocusWithin" Value="False" />
                                    <Condition Property="Text" Value="{x:Null}" />
                                </MultiTrigger.Conditions>
                                <Setter TargetName="Placeholder" Property="Visibility" Value="Visible" />
                            </MultiTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </TextBox.Style>
</TextBox>

我希望这有帮助。


推荐阅读