Wpf文本框验证控件模板触发文本值
Posted
技术标签:
【中文标题】Wpf文本框验证控件模板触发文本值【英文标题】:Wpf textbox validation controltemplate trigger on text value 【发布时间】:2019-02-28 07:55:00 【问题描述】:我有一个文本框:
<TextBox Grid.Row="3"
Grid.Column="1"
Width="200"
TextWrapping="Wrap"
VerticalAlignment="Top"
Margin="5,10,-10,2"
Style="StaticResource TextBoxValueStyle"
Validation.ErrorTemplate="StaticResource ValidationControlTemplate">
<TextBox.Text>
<MultiBinding StringFormat=" 0 1">
<Binding Path="Id" ValidatesOnNotifyDataErrors="True" NotifyOnValidationError="True"/>
<Binding Path="Name" />
</MultiBinding>
</TextBox.Text>
</TextBox>
这是我的控制模板:
<ControlTemplate x:Key="ValidationControlTemplate">
<DockPanel Visibility="Binding ElementName=Placeholder, Path=Visibility">
<Image x:Name="Image"
DockPanel.Dock="Right"
VerticalAlignment="Center"
Margin="0,-2"
Style="StaticResource InformationImageStyle">
<Image.ToolTip>
<ItemsControl ItemsSource="Binding">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="Binding ErrorContent"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Image.ToolTip>
</Image>
<AdornedElementPlaceholder Name="Placeholder" VerticalAlignment="Center"/>
</DockPanel>
<ControlTemplate.Triggers>
<Trigger Property="TextBox.Text" Value="">
<Setter Property="DockPanel.Dock" TargetName="Image" Value="Left"/>
<Setter Property="Margin" TargetName="Image" Value="-20,-2"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
我的问题是,当文本框有一个值(并且有错误)时,它没有采用原始值(DockPanel.Dock=Right and Margin=0,-2)
我总是从空文本开始。图像总是显示在左边,错误。
我错过了什么?
【问题讨论】:
我不明白你的问题。Validation.ErrorTemplate
只会在实际出现错误时显示。当没有验证错误时,没有DockPanel
。
@mm8 如果文本框中有文本仍然可能是错误,然后我希望图像显示在右侧,而不是左侧。
所以你的问题是图像(总是)显示在左侧?
@mm8 是的,这就是我无法解决的问题 =(
@mm8 出现错误时总是在左侧,没有错误时我看不到图片(应该是这样)
【参考方案1】:
在<AdornedElementPlaceholder />
元素周围放置一个Grid
,并将Trigger
替换为绑定到装饰的TextBox
元素的DataTrigger
:
<ControlTemplate x:Key="ValidationControlTemplate">
<DockPanel Visibility="Binding ElementName=Placeholder, Path=Visibility">
<Image x:Name="Image"
DockPanel.Dock="Right"
VerticalAlignment="Center"
Margin="0,-2"
Style="StaticResource InformationImageStyle">
<Image.ToolTip>
<ItemsControl ItemsSource="Binding">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="Binding ErrorContent"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Image.ToolTip>
</Image>
<Grid>
<AdornedElementPlaceholder Name="Placeholder" VerticalAlignment="Center"/>
</Grid>
</DockPanel>
<ControlTemplate.Triggers>
<DataTrigger Binding="Binding AdornedElement.Text.Length, ElementName=Placeholder" Value="0">
<Setter Property="DockPanel.Dock" TargetName="Image" Value="Left"/>
<Setter Property="Margin" TargetName="Image" Value="-20,-2"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
【讨论】:
非常好!非常感谢,我不得不将值更改为 2 但这是因为我在文本框多绑定中有两个空格 =))以上是关于Wpf文本框验证控件模板触发文本值的主要内容,如果未能解决你的问题,请参考以下文章