Ответ 1
Вы можете использовать интерфейс System.ComponentModel.IDataErrorInfo. Этот очень удобный интерфейс дает вам возможность:
- выполнить проверку в соответствии с MVVM
- выполнить выборочную проверку для любого конкретного поля (проверка может проверить несколько значений, если вы этого хотите)
- привяжите ваш интерфейс к ошибкам проверки.
Вы реализуете IDataErrorInfo на своей модели viewmodel (или даже практически в своей модели базы моделей и переопределяете ее в своих производных моделях). Из-за характера привязки данных значения, которые мне нужно проверить, все они есть в модели представления, и я могу проверить любую их комбинацию. Конечно, вы все еще имеете свою проверку на своем бизнес-уровне, но вам больше не нужно совершать поездку на ваш бизнес-уровень (или модель), чтобы произвести некоторую проверку.
Вот краткий пример с экрана (WPF), который собирает некоторые детали пользователя и выполняет базовую проверку:
Код С#:
#region IDataErrorInfo Members
/// <summary>
/// Gets an error message indicating what is wrong with this object.
/// </summary>
/// <value></value>
/// <returns>An error message indicating what is wrong with this object. The default is an empty string ("").</returns>
public override string Error
{
get
{
return this["UserCode"] + this["UserName"] + this["Password"] + this["ConfirmedPassword"] + this["EmailAddress"];
}
}
/// <summary>
/// Gets the <see cref="System.String"/> with the specified column name.
/// </summary>
/// <value></value>
public override string this[string columnName]
{
get
{
switch (columnName)
{
case "UserCode":
if (!string.IsNullOrEmpty(UserCode) && UserCode.Length > 20)
return "User Code must be less than or equal to 20 characters";
break;
case "UserName":
if (!string.IsNullOrEmpty(UserCode) && UserCode.Length > 60)
return "User Name must be less than or equal to 60 characters";
break;
case "Password":
if (!string.IsNullOrEmpty(Password) && Password.Length > 60)
return "Password must be less than or equal to 60 characters";
break;
case "ConfirmedPassword":
if (Password != ConfirmedPassword)
return Properties.Resources.ErrorMessage_Password_ConfirmedPasswordDoesntMatch;
break;
case "EmailAddress":
if (!string.IsNullOrEmpty(EmailAddress))
{
var r = new Regex(_emailRegex);
if (!r.IsMatch(EmailAddress))
return Properties.Resources.ErrorMessage_Email_InvalidEmailFormat;
}
break;
}
return string.Empty;
}
}
#endregion
и вот разметка XAML для двух текстовых полей на странице (особенно обратите внимание на свойства ValidatesOnDataErrors
и ValidatesOnExceptions
в привязке Text
):
<TextBox Name="UserCodeTextBox"
Text="{Binding UserCode,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True,
ValidatesOnExceptions=True,
NotifyOnSourceUpdated=True,
NotifyOnTargetUpdated=True}"
GotFocus="Input_GotFocus"
VerticalAlignment="Top"
Margin="165,0,150,0"
CharacterCasing="Upper"
/>
<TextBox Name="UserNameTextBox"
Text="{Binding UserName,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True,
ValidatesOnExceptions=True,
NotifyOnSourceUpdated=True,
NotifyOnTargetUpdated=True}"
GotFocus="Input_GotFocus"
VerticalAlignment="Top"
Margin="165,30,0,0"
/>