IDataErrorInfo

时间:2016-01-13 16:26:56

标签: c# wpf mvvm 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;
        }
    }
}

Cost属性在ViewModel中绑定到文本框,允许用户输入自己的数据。在实现IDataErrorInfo之前,用户在此框中键入文本会导致其以红色突出显示,但未显示任何错误消息。这被认为是足够的警告。

现在,在方框I中打开文本,在实施的样式I上显示错误,这很好。另外还有一条信息:价值' [文字]'无法转换,但这对用户来说有点不合时宜。真正的问题是,如果有人输入大于10000.00的数字并触发自定义消息,然后删除该值并将其替换为文本,则旧的错误消息将保留在原位。

通过断点,它清楚地发生了什么:因为View期望这是一个双倍,它甚至不会检查IDataErrorInfo是否已经改变。如何清除错误消息并将其替换为更有意义的内容?我无法解析费用,因为当然,它是双倍的,所以如果有人输入文字,它甚至不会被设置?

2 个答案:

答案 0 :(得分:1)

最好的方法是将Cost属性的类型更改为string并尝试在验证回调中解析它。使用这种方法不需要在XAML中使用任何ValidationRules,只需使用IDataErrorInfo。

在本文中可以找到更多内容:Josh Smith的https://joshsmithonwpf.wordpress.com/2008/11/14/using-a-viewmodel-to-provide-meaningful-validation-error-messages/

干杯

答案 1 :(得分:1)

 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绑定到文本框。

奖励:您现在可以验证用户是否输入了数值。