У меня есть форма:
<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"};
Я вижу данные в форме, а метка для имени выделена жирным шрифтом, что указывает на необходимость. Тем не менее, если я очищаю поле или задаю для него строку недопустимой длины, я не получаю ни проверки, ни самой метки, ни сводки проверки. Я понимаю, что текстовое поле не проверяется до потери фокуса, поэтому я щелкаю в поле приветствия и вводю текст, чтобы убедиться, что я оставил другой текстовый элемент управления.
Что мне здесь не хватает?
Ответ:
За ответ @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, я рассмотрю его. Спасибо!