Мы подошли к нему, как это:
У нас есть класс ValidationProperty, который принимает в RegularExpression, который будет использоваться для проверки значения (можно использовать все, что вы хотели).
ValidationProperty.cs
public class ValidationProperty
{
#region Constructors
/// <summary>
/// Constructor for property with validation
/// </summary>
/// <param name="regularExpression"></param>
/// <param name="errorMessage"></param>
public ValidationProperty(string regularExpression, string errorMessage)
{
RegularExpression = regularExpression;
ErrorMessage = errorMessage;
IsValid = true;
}
#endregion
#region Properties
/// <summary>
/// Will be true if this property is currently valid
/// </summary>
public bool IsValid { get; private set; }
/// <summary>
/// The value of the Property.
/// </summary>
public object Value
{
get { return val; }
set
{
if (this.Validate(value))//if valid, set it
{
val = value;
}
else//not valid, throw exception
{
throw new ValidationException(ErrorMessage);
}
}
}
private object val;
/// <summary>
/// Holds the regular expression that will accept a vaild value
/// </summary>
public string RegularExpression { get; private set; }
/// <summary>
/// The error message that will be thrown if invalid
/// </summary>
public string ErrorMessage { get; private set; }
#endregion
#region Private Methods
private bool Validate(object myValue)
{
if (myValue != null)//Value has been set, validate it
{
this.IsValid = Regex.Match(myValue.ToString(), this.RegularExpression).Success;
}
else//still valid if it has not been set. Invalidation of items not set needs to be handled in the layer above this one.
{
this.IsValid = true;
}
return this.IsValid;
}
#endregion
}
Вот как мы бы создать свойство Validation. Обратите внимание, как открытый член является строкой, но в частном порядке я использую «ValidationProperty».
public string TaskNumber
{
get { return taskNumber.Value.ToString(); }
set
{
taskNumber.Value = value;
OnPropertyChanged("TaskNumber");
}
}
private ValidationProperty taskNumber;
Теперь, когда значение установлено, бизнес-уровень будет проверять, что это допустимое значение. Если это не так, это просто вызовет новое исключение ValidationException (в классе ValidationProperty). В вашем xaml вам нужно будет установить NotifyOnValidationError & ValidatesOnExceptions в true.
<TextBox Text="{Binding TaskNumber, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True}"/>
При таком подходе, вы, вероятно, имеют форму для создания нового пользователя «», а каждое поле будет valitate каждый раз, когда они устанавливают его (я надеюсь, что имеет смысл).
Это подход, который мы использовали, чтобы получить подтверждение на бизнес-уровне. Я не уверен, что это именно то, что вы ищете, но я надеюсь, что это поможет.
Когда я прочитал ваш вопрос, я понял, что раньше не читал его :(Я думал, что вы создаете свойство и пытаетесь проверить свойство на своем объекте, а не на методе. Думаю, я никогда не делал то, что вы пытаетесь сделать, но, возможно, мой ответ зажжет некоторые идеи для вас. Извините! – JSprang
Не беспокойтесь - спасибо за ответ. Большинство из того, что вы пытаетесь сделать, могут быть решены с помощью DataAnnotations. INotifyDataErrorInfo и INotifyPropertyChanged (или просто подкласс System.ServiceModel.DomainServices.Client.Entity), и вы можете получить ошибку проверки UX для «free» с помощью элемента ValidationSummary. Вы можете написать специальные декодеры проверки, расширив System.ComponentModel.DataAnnotations.ValidationAttribute , или даже указать на существующий метод проверки в вашем коде, используя System.ComponentModel.DataAnnotations.CustomVal атрибут idation. – lo5
Да, это то, что мы делаем. Мы используем этот подход, хотя вместо DataAnnotations, чтобы мы могли иметь логику проверки на бизнес-уровне, если это имеет смысл. – JSprang