【发布时间】:2012-11-14 20:23:13
【问题描述】:
正如您可能从标题中看到的那样,我要问一个以前被问过很多次的问题。但是,在阅读了所有这些其他问题之后,我仍然找不到解决问题的好方法。
我有一个带有基本验证的模型类:
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将是真的,即使 虽然还有其他字段仍然无效)。
我发现的另一个解决方案是使用ErrorCount 属性。但是,由于我正在验证每个属性更改(以及每个键入的字符),这也是不可能的 - 我怎么知道何时增加/减少 ErrorCount?
解决这个问题的最佳方法是什么?
谢谢
【问题讨论】:
-
避免像这样编写所有的验证类,这很受欢迎。值得注意的是列名如何映射到带有错误结果的 if 块,因此可以为它们使用委托函数的映射;产生所有不必要的
ifs。但是让我们假设您要使用它们,您在if (A)中执行if (B),因此您可以改为使用if (A && B)。如果只执行if中的一条语句,则不必键入{和}字符。通过使用地图,这个示例可以在 ~20 行而不是 ~50 行上;将您的开发速度提高一倍。