我有一张表格:
<StackPanel x:Name="LayoutRoot">
<sdk:ValidationSummary />
<sdk:Label Target="{Binding ElementName=Greeting}" />
<TextBox x:Name="Greeting" Text="{Binding Greeting, Mode=TwoWay,
ValidatesOnExceptions=True, NotifyOnValidationError=True}" />
<sdk:Label Target="{Binding ElementName=Name}" />
<TextBox x:Name="Name" Text="{Binding Name, Mode=TwoWay,
ValidatesOnExceptions=True, NotifyOnValidationError=True}" />
</StackPanel>
这是一个简单的类,它被设置为DataContext ...
public class Person : INotifyPropertyChanged
{
private string _greeting;
private string _name;
public string Greeting
{
get { return _greeting; }
set
{
_greeting = value;
InvokePropertyChanged(new PropertyChangedEventArgs("Greeting"));
}
}
[Required(ErrorMessage = "Name must be provided")]
[StringLength(15, MinimumLength = 5,
ErrorMessage = "Name should be 5 to 15 characters")]
public string Name
{
get { return _name; }
set
{
_name = value;
InvokePropertyChanged(new PropertyChangedEventArgs("Name"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void InvokePropertyChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, e);
}
}
我在xaml后面的代码中使用以下行设置数据上下文:
DataContext = new Person {Name = "Joe User"};
我在表单上看到数据,而Name的标签是粗体,表示必填。但是,如果我清空该字段,或将其设置为无效长度的字符串,则无法在标签本身或验证摘要中进行验证。我知道文本框在失去焦点之前不会进行验证,所以我点击问候语字段并输入文字以确保我已经离开了另一个文本控件。
我在这里缺少什么?
答案:
根据@Alex Paven的回答,为了让它与您使用的数据注释一起使用:
[Required(ErrorMessage = "Name must be provided")]
[StringLength(15, MinimumLength = 5,
ErrorMessage = "Name should be 5 to 15 characters")]
public string Name
{
get { return _name; }
set
{
Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "Name" });
_name = value;
InvokePropertyChanged(new PropertyChangedEventArgs("DisplayName"));
}
}
至于IDataErrorInfo,我会调查一下。谢谢!
答案 0 :(得分:2)
您错过了实际的验证通话。使用ValidatesOnExceptions时,必须在属性设置器中抛出异常,并且不会在验证时自动考虑属性。要使它工作,您需要使用正确的参数调用System.ComponentModel.DataAnnotations.Validator.ValidateProperty。
但是,如果使用Silverlight 4,我建议使用IDataErrorInfo进行验证,因为我认为它提供了更大的灵活性。