我正在尝试为文本框创建wpf错误验证。看起来很简单,但经过几天尝试很多方法后,我仍然试图找出正确的方法。
这是我的代码(这不是我的真实代码,只是一个例子):
<TextBox Text="{Binding Model.Name , UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=True}"
Style="{StaticResource NameTextBoxStyle}" />
<Style x:Uid="Style_81" x:Key="NameTextBoxStyle}" TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Trigger.Setters>
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},Path= (Validation.Errors)[0].ErrorContent}"/>
</Trigger.Setters>
</Trigger>
</Style.Triggers>
</Style>
Public Class SomeClass
{
public bool IsNameMandatory { get; set; }
string name;
public string Name
{
get
{
return name;
}
set
{
if (IsNameMandatory && String.IsNullOrEmpty(value))
{
throw new Exception("Name can not be empty.");
}
if (value.Length > 12)
{
throw new Exception("name can not be longer than 12 charectors");
}
name = value;
OnPropertyChanged("Name");
}
}
}
问题:错误验证正在运行,但是当模型被&#34;初始化&#34;并将一个空白值设置为&#34; Name&#34;使用工具提示使用消息框而不是红色矩形引发异常。我不想要在消息框中显示异常。
我的需求:我只需要在文本框的 LostFocus 和按需
上验证错误答案 0 :(得分:2)
以下是使用Binding.ValidationRules Property正确完成WPF验证的方法:
在您的视图中:
xmlns:tools="clr-namespace:SomeAppNameSpace.Tools"
<TextBox Style="{StaticResource SomeStyle}">
<TextBox.Text>
<Binding Path="SomeProperty" UpdateSourceTrigger="LostFocus" >
<Binding.ValidationRules>
<tools:SomeValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
ValidationRule类位于您的工具(或等效的)命名空间中:
public class SomeValidationRule : ValidationRule
{
public override ValidationResult Validate(object value,
CultureInfo cultureInfo)
{
var userText = value as string;
return String.IsNullOrWhiteSpace(userText) ?
new ValidationResult(false, "Value must be provided.") :
new ValidationResult(true, null);
}
}
因此,这个简单的ValidationRule
会检查LostFocus
上的文本框,如果文本框留空,则会返回验证错误消息...
最后一个难题是你的“SomeStyle”是上面文本框的样式必须定义Validation.ErrorTemplate
......这样的事情:
<Style x:Key="SomeStyle" TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate >
<!-- Your Error Template here. Typically a border with
red background and a textbox with light colored text... -->
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>