こんにちは、私はこの問題についてグーグルで調べていますが、これについて有用なものは見つかりませんでした。
DataAnnotations ごとの検証が失敗した場合、プロパティのセットを拒否したい
私のコードで何が欠けているか教えてください。
モデル Codesnip
private string _firstname;
public string Firstname
{
get { return _firstname; }
set
{
_firstname = value;
RaisePropertyChanged(() => Reg(() => Firstname));
}
}
ViewModel Codesnip
[Required]
[RegularExpression(@"^[a-zA-ZäöüßÄÖÜß''-'\s]{2,40}$")]
public string Name
{
get { return currentperson.Name; }
set
{
currentperson.Name = value;
RaisePropertyChanged(() => Reg(() => Name));
}
}
Codesnip を表示
<TextBox HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" Text="{Binding Firstname,UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"/>
どんな助けでも大歓迎です
編集:検証クラスの追加
public class VMValidation : VMBase, IDataErrorInfo
{
private Dictionary<string, string> ErrorList = new Dictionary<string, string>();
/// <summary>
/// Gets a value indicating whether or not this domain object is valid.
/// </summary>
public bool IsVailid
{
get { return (ErrorList.Count == 0) ? true : false; }
}
#region IDataErrorInfo
/// <summary>
/// Gets an error message indicating what is wrong with this domain object.
/// The default is an empty string ("").
/// </summary>
public string Error
{
get { return getErrors(); } // noch keine richtige methode für gefunden müsste so aber auch funktionieren
}
/// <summary>
/// dies ist eine methode die durch einen Event (noch unbekannt welcher)
/// ausgelöst wird und den Propertynamen schon mit übergeben bekommt
/// </summary>
/// <param name="propertyName">Name der Property z.B FirstName</param>
/// <returns>The error message for the property.
/// The default is an empty string ("").</returns>
public string this[string propertyName]
{
get { return OnValidate(propertyName); }
}
private string getErrors()
{
string Error = "";
foreach (KeyValuePair<string, string> error in ErrorList)
{
Error += error.Value;
Error += Environment.NewLine;
}
return Error;
}
/// <summary>
/// Validates current instance properties using Data Annotations.
/// </summary>
/// <param name="propertyName">Name der Property</param>
/// <returns>ErrorMsg</returns>
protected virtual string OnValidate(string propertyName)
{
if (string.IsNullOrEmpty(propertyName))
throw new ArgumentException("Invalid property name", propertyName);
string error = string.Empty;
var value = this.GetType().GetProperty(propertyName).GetValue(this, null);
var results = new List<ValidationResult>(1);
var context = new ValidationContext(this, null, null) { MemberName = propertyName };
var result = Validator.TryValidateProperty(value, context, results);
if (!result)
{
var validationResult = results.First();
error = validationResult.ErrorMessage;
}
if (error.Length > 0)
{
if (!ErrorList.ContainsKey(propertyName))
ErrorList.Add(propertyName, error);
}
else
if (!ErrorList.ContainsKey(propertyName))
ErrorList.Remove(propertyName);
return error;
}
public bool VailidValue(string propertyName, object value)
{
var results = new List<ValidationResult>(1);
var context = new ValidationContext(this, null, null) { MemberName = propertyName };
var result = Validator.TryValidateProperty(value, context, results);
return result;
}
#endregion //IDataErrorInfo
}