正如您可能从标题中看到的那样,我要问一个以前被问过很多次的问题。但是,在阅读了所有这些其他问题之后,我仍然找不到解决问题的好方法。
我有一个带有基本验证的模型类:
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"/>
这很完美。验证发生(PropertyChanged
绑定代码在 VM 中的 CurrentPlayer 属性上完成,该属性是 Player 的一个对象)。
我现在想做的是在验证失败时禁用保存按钮。
首先,似乎在这个线程中找到了最简单的解决方案:
Enable Disable save button during Validation using IDataErrorInfo
- 如果我想遵循公认的解决方案,我必须编写两次验证代码,因为我不能简单地使用索引器。编写双重代码绝对不是我想要的,所以这不是我问题的解决方案。
- 该线程上的第二个答案听起来非常有希望,但问题是我有多个必须验证的字段。这样,一切都依赖于最后检查的属性(因此,如果该字段正确填写,则为
CanSave
true,即使还有其他字段仍然无效)。
我发现的另一个解决方案是使用ErrorCount
属性。但是,当我在每次属性更改时(以及在每个键入的字符处)进行验证时,这也是不可能的 - 我怎么知道何时增加/减少ErrorCount
?
解决这个问题的最佳方法是什么?
谢谢