正如您从标题中可能看到的那样,我将要问一些以前被问过很多次的问题。但是,在阅读了所有这些其他问题之后,我仍然找不到解决问题的合适方法。
我有一个带有基本验证的模型类:
partial class Player : IDataErrorInfo
{
public bool CanSave { get; set; }
public string this[string columnName]
{
get
{
string result = null;
if (columnName == "Firstname")
{
if (String.IsNullOrWhiteSpace(Firstname))
{
result = "Geef een voornaam in";
}
}
if (columnName == "Lastname")
{
if (String.IsNullOrWhiteSpace(Lastname))
{
result = "Geef een familienaam in";
}
}
if (columnName == "Email")
{
try
{
MailAddress email = new MailAddress(Email);
}
catch (FormatException)
{
result = "Geef een geldig e-mailadres in";
}
}
if (columnName == "Birthdate")
{
if (Birthdate.Value.Date >= DateTime.Now.Date)
{
result = "Geef een geldige geboortedatum in";
}
}
CanSave = true; // this line is wrong
return result;
}
}
public string Error { get { throw new NotImplementedException();} }
}
每次属性更改时都会执行此验证(因此每次用户在文本框中键入一个字符时):
<TextBox Text="{Binding CurrentPlayer.Firstname, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="137" IsEnabled="{Binding Editing}" Grid.Row="1"/>
这很完美。验证发生(用于绑定(bind)的 PropertyChanged
代码在 VM 中的 CurrentPlayer 属性上完成,它是 Player 的一个对象)。
我现在想做的是在验证失败时禁用保存按钮。
首先,最简单的解决方案似乎是在这个线程中找到的:
Enable Disable save button during Validation using IDataErrorInfo
- 如果我想遵循公认的解决方案,我必须写下我的 验证代码两次,因为我不能简单地使用索引器。写作 双码绝对不是我想要的,所以这不是解决方案 我的问题。
- 该线程的第二个答案听起来很有希望,就像第一个一样,
但问题是我有多个字段必须
验证。这样,一切都依赖于最后检查的属性
(因此,如果该字段填写正确,
CanSave
将为真,即使 尽管还有其他字段仍然无效)。
我发现的另一种解决方案是使用 ErrorCount
属性。但是当我在每次属性更改(以及每个键入的字符)时进行验证时,这也是不可能的 - 我怎么知道何时增加/减少 ErrorCount
?
解决这个问题的最佳方法是什么?
谢谢
最佳答案
本文http://www.asp.net/mvc/tutorials/older-versions/models-%28data%29/validating-with-the-idataerrorinfo-interface-cs将单独的验证移动到属性中:
public partial class Player : IDataErrorInfo
{
Dictionary<string, string> _errorInfo;
public Player()
{
_errorInfo = new Dictionary<string, string>();
}
public bool CanSave { get { return _errorInfo.Count == 0; }
public string this[string columnName]
{
get
{
return _errorInfo.ContainsKey(columnName) ? _errorInfo[columnName] : null;
}
}
public string FirstName
{
get { return _firstName;}
set
{
if (String.IsNullOrWhiteSpace(value))
_errorInfo.AddOrUpdate("FirstName", "Geef een voornaam in");
else
{
_errorInfo.Remove("FirstName");
_firstName = value;
}
}
}
}
(您必须处理 Dictionary AddOrUpdate
扩展方法)。这类似于您的错误计数想法。
关于c# - 验证失败时禁用保存按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13386698/