【发布时间】:2016-04-27 08:13:36
【问题描述】:
我现在有点困惑,因为我不确定“谁负责验证模型数据”之类的事情。
举个例子:
我有一个应用程序,其中人员和特定设备之间的关系被可视化。
public class Person{
public string Firstname {get; set;}
public string Lastname {get; set;}
public SomeSortOfDevice SomeSortOfDevice {get; set;}
}
public class SomeSortOfDevice{
public DateTime DeviceExpiration {get; set;}
public string DeviceSerialCode {get; set;}
//public bool IsSerialCodeValid{get{
// SomeValidationLogic()
//}
}
在视图中,应用用户可以更改设备的数据。 现在有一些规则 - 例如,DeviceExpiration 绑定到一个 TextBox,但只有在设置了有效的 SerialCode 时才应该启用。
但是谁来决定 SerialCode 是否有效?模型本身?视图模型?模型是否应该拥有一个额外的属性“IsSerialValid”,或者如何将 TextBox 的 IsEnabled 属性绑定到该规则?
编辑 1
public class ViewModel{
public Person SelectedPerson {get; set;}
}
这就是我如何使用上面的模型 - 视图将在 SeletedPerson 上获得一些绑定。
编辑 2
我认为这比我之前解释的要复杂一些。假设设备是一个令牌,我想确定用户是否输入了一些东西 - 如果他输入了一些东西,它是否有效?
如果验证应该在模型中处理(正如我现在所知道的那样),模型将如下所示:
public Token{
public DateTime ExpirationDate {get; set;}
public string Serial {get; set;}
public bool IsTokenExpired{
get{
return ExpirationDate.Date < DateTime.Now;
}
}
public bool IsTokenValid{
get{
return new Regex("[0-9]{8,12}").Match().Success;
}
}
public bool IsTokenSet{
get{
return TokenSerial.Length > 0;
}
}
}
现在启用用户应输入(或选择)日期的文本框,绑定如下所示:
<TextBox IsEnabled="{Binding SelectedPerson.Token.IsTokenValid}"/>
这很好用,但我对模型中的验证规则并没有很好的感觉。
【问题讨论】:
-
ViewModel应该处理验证 -
如果验证通过,您能告诉我们您要执行的命令吗?
-
查看IDataErrorInfo,WPF控件支持。
-
我听说过 IDataErrorInfo 但我不想通知用户串行的无效状态 - 我只想禁用另一个控件。
-
那么我们不是在讨论验证本身,而是在讨论 UI 逻辑,这是 VM 的一项任务。
标签: c# wpf validation mvvm