【发布时间】:2020-09-02 17:48:57
【问题描述】:
在下面的代码中,我使用ValidationRule 来验证TextBox 上的用户输入。它工作正常。如果用户输入无效数据(任何非字母字符),它会在文本框左侧显示一个小的红色! 符号,并且如果您将鼠标悬停在文本框上,它将显示无效数据消息(如下图所示) .
问题:我们如何修改下面的代码-instead of tooltip,在文本框下方显示无效数据消息?
备注:我尝试在下面 XAML 的以下行 <Setter Property="ToolTip" 中将 ToolTip 替换为 TexBlock,并在 TexBox 下方放置一个文本块,如下所示:<TextBlock Text="{Binding (Validation.Errors)[0].ErrorContent, ElementName=txtTest}"/>。但是(正如预期的那样)它不起作用,因为 TextBlock 当然不是 TextBox 的属性
MyDataSource.cs:
public class MyDataSource
{
public MyDataSource()
{
}
public string FirstName { get; set; }
}
AlphabetsOnlyValidationRule:
public class AlphabetsOnlyValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
string sVal = value as string;
if (string.IsNullOrEmpty(sVal))
{
return new ValidationResult(false, "Please enter some text");
}
if (!sVal.ToList().All(t => char.IsLetter(t)))
{
return new ValidationResult(false, "First Name should contains alphabets only");
}
return new ValidationResult(true, null);
}
}
MainWindow.xaml:
<Window.Resources>
<local:MyDataSource x:Key="Ods"/>
<local:AlphabetsOnlyValidationRule x:Key="AlphabetsOnlyKey"/>
<ControlTemplate x:Key="ValidationTemplate">
<DockPanel>
<TextBlock Foreground="Red" FontSize="20">!</TextBlock>
<AdornedElementPlaceholder/>
</DockPanel>
</ControlTemplate>
<Style x:Key="TextBoxInError" TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<TextBox x:Name="txtTest" Margin="48,0,572,388" Style="{StaticResource TextBoxInError}" Validation.ErrorTemplate="{StaticResource ValidationTemplate}">
<TextBox.Text>
<Binding Path="FirstName" Source="{StaticResource Ods}" UpdateSourceTrigger="PropertyChanged" >
<Binding.ValidationRules>
<local:AlphabetsOnlyValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</Grid>
验证信息截图 [当用户输入非字母字符时]
【问题讨论】:
标签: wpf xaml data-binding