【问题标题】:Data triggers trying to get Text.IsEmpty or Text.IsNullOrEmpty property尝试获取 Text.IsEmpty 或 Text.IsNullOrEmpty 属性的数据触发器
【发布时间】:2020-06-28 20:23:15
【问题描述】:

我正在为我的文本输入创建一个基本样式,这些将有一个占位符。我正在尝试绑定 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 不是很深入,所以也许我使用了错误的源属性?任何人都可以建议我应该根据我的条件绑定什么。

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

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

【问题讨论】:

    标签: wpf multidatatrigger


    【解决方案1】:

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

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

    在下面的示例中,我默认使用了占位符 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>
    

    我希望这会有所帮助。

    【讨论】:

    • 帮了很多忙,我会更深入地查看您的代码以了解所有内容。
    猜你喜欢
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2015-09-22
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多