与 IDataErrorInfo 一起进行数据类型验证
Data type validation alongside IDataErrorInfo
我刚刚开始向 WPF MVVM 项目添加一些验证。这种范式中的验证对我来说是新的,但它看起来相当简单:
public partial class Price : IDataErrorInfo
{
public double Cost { get; set; }
public string Error
{
get { throw new NotImplementedException(); }
}
string IDataErrorInfo.this[string columnName]
{
get
{
string message = null;
if (columnName == "Cost" && this.Cost > 10000.00)
{
message = "This price is high enough to require confirmation";
}
return message;
}
}
}
成本 属性 在 ViewModel 中绑定到文本框,允许用户输入自己的数据。在实施 IDataErrorInfo 之前,用户在此框中键入文本会导致它以红色突出显示,但不会显示任何错误消息。这被认为是足够的警告。
现在,在框中输入文本会在我实现的样式上轻弹以显示错误,这很好。另外还有一条消息:无法转换值“[文本]”,但这对用户来说有点深奥。真正的问题是,如果有人输入大于 10000.00 的数字并触发自定义消息,然后删除该值并用文本替换它,旧的错误消息将保留在原位。
有了断点,就很清楚发生了什么:因为视图期望这是一个双精度值,所以它甚至都不会检查 IDataErrorInfo 是否已更改。如何清除错误消息并将其替换为更有意义的内容?我无法解析 Cost,因为,当然,它是双精度的,所以如果有人输入文本,它甚至永远不会被设置?
最好将 Cost
属性 的类型更改为字符串,然后尝试在验证回调中解析它。使用这种方法不需要在 XAML 中使用任何 ValidationRules
,只需 IDataErrorInfo.
更多内容可在这篇文章中找到:https://joshsmithonwpf.wordpress.com/2008/11/14/using-a-viewmodel-to-provide-meaningful-validation-error-messages/ 作者:Josh Smith。
干杯
public class Price : IDataErrorInfo
{
private double _costDouble;
private string _cost;
public string Cost
{
get {
return _cost;
}
set {
_cost = value;
double.TryParse(value, out _costDouble);
}
}
public string Error
{
get { throw new NotImplementedException(); }
}
string IDataErrorInfo.this[string columnName]
{
get
{
string message = null;
if (columnName == "Cost")
{
double doubleVal;
if (double.TryParse(this.Cost, out doubleVal))
{
if (doubleVal > 1000.0)
message = "This price is high enough to require confirmation";
}
else {
message = "Format error";
}
}
return message;
}
}
}
您最终必须使用 String-Property 绑定到文本框。
奖励:您现在可以验证用户是否输入了数值。
我刚刚开始向 WPF MVVM 项目添加一些验证。这种范式中的验证对我来说是新的,但它看起来相当简单:
public partial class Price : IDataErrorInfo
{
public double Cost { get; set; }
public string Error
{
get { throw new NotImplementedException(); }
}
string IDataErrorInfo.this[string columnName]
{
get
{
string message = null;
if (columnName == "Cost" && this.Cost > 10000.00)
{
message = "This price is high enough to require confirmation";
}
return message;
}
}
}
成本 属性 在 ViewModel 中绑定到文本框,允许用户输入自己的数据。在实施 IDataErrorInfo 之前,用户在此框中键入文本会导致它以红色突出显示,但不会显示任何错误消息。这被认为是足够的警告。
现在,在框中输入文本会在我实现的样式上轻弹以显示错误,这很好。另外还有一条消息:无法转换值“[文本]”,但这对用户来说有点深奥。真正的问题是,如果有人输入大于 10000.00 的数字并触发自定义消息,然后删除该值并用文本替换它,旧的错误消息将保留在原位。
有了断点,就很清楚发生了什么:因为视图期望这是一个双精度值,所以它甚至都不会检查 IDataErrorInfo 是否已更改。如何清除错误消息并将其替换为更有意义的内容?我无法解析 Cost,因为,当然,它是双精度的,所以如果有人输入文本,它甚至永远不会被设置?
最好将 Cost
属性 的类型更改为字符串,然后尝试在验证回调中解析它。使用这种方法不需要在 XAML 中使用任何 ValidationRules
,只需 IDataErrorInfo.
更多内容可在这篇文章中找到:https://joshsmithonwpf.wordpress.com/2008/11/14/using-a-viewmodel-to-provide-meaningful-validation-error-messages/ 作者:Josh Smith。
干杯
public class Price : IDataErrorInfo
{
private double _costDouble;
private string _cost;
public string Cost
{
get {
return _cost;
}
set {
_cost = value;
double.TryParse(value, out _costDouble);
}
}
public string Error
{
get { throw new NotImplementedException(); }
}
string IDataErrorInfo.this[string columnName]
{
get
{
string message = null;
if (columnName == "Cost")
{
double doubleVal;
if (double.TryParse(this.Cost, out doubleVal))
{
if (doubleVal > 1000.0)
message = "This price is high enough to require confirmation";
}
else {
message = "Format error";
}
}
return message;
}
}
}
您最终必须使用 String-Property 绑定到文本框。
奖励:您现在可以验证用户是否输入了数值。