试图获取文本的数据触发器.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>

我希望这能有所帮助。

最新更新