试图获取 Text.IsEmpty 或 Text.IsNullOrEmpty 属性 的数据触发器
Data triggers trying to get Text.IsEmpty or Text.IsNullOrEmpty property
我正在为我的文本输入创建一个基本样式,它们将有一个占位符。我正在尝试绑定 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>
希望对您有所帮助。
我正在为我的文本输入创建一个基本样式,它们将有一个占位符。我正在尝试绑定 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>
希望对您有所帮助。