wpf - 尝试获取 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
所以也许我使用了错误的源属性?任何人都可以建议我应该根据我的条件绑定什么。
应该没有文本,空格算作没有文本。
或者,如果输入聚焦,占位符就会消失。
解决方案
我看到的第一个问题是你的逻辑被颠倒了。您的触发器表示,如果控件未聚焦且文本为空,则隐藏占位符。(我认为这不是你想要的)
我看到的第二个问题是您在控制模板中使用数据触发器。在控件模板中,您可以只使用普通触发器,因为您可以直接访问所有元素。
在下面的示例中,我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>
我希望这有帮助。
推荐阅读
- django - 使用相关对象的外键预取或注释 Django 模型
- mysql - 在 MySQL 中搜索 JSON 数据中的属性的 SQL 查询
- mobile - 服务器端渲染是否适合移动应用?
- robotframework - 在机器人框架测试用例创建自定义库类的新实例时传递参数
- jquery - 显示/隐藏 onClick JQuery
- lisp - 在 lisp 中更改数组值的最佳方法
- spark-java - 从模板中查找路由/url?(Java Spark 框架)
- jquery - .addclass 的平滑过渡以及将 scrollTop 设置为特定的 div?
- regex - Lua:如何替换两个或多个重复的“?” 带有空字符串的字符?
- mysql - 当我迁移文件时,它只显示 varchar(191) 而不是 255