IDataErrorInfo在绑定发生之前验证

时间:2014-01-27 20:16:23

标签: c# wpf

我想在WPF中做一些简单的文本框验证,但我刚刚意识到IDataErrorInfo依赖于引发PropertyChanged事件以触发验证,这意味着在验证发生之前将无效值应用于我的绑定对象。有没有办法改变这一点,以便首先进行验证(并防止对无效数据进行绑定),还是有另一种解决方案可以这样工作?

修剪下来的代码如下所示:

<TextBox>
    <TextBox.Text>
        <Binding Path="MyProperty" ValidatesOnDataErrors="True" />
    </TextBox.Text>
</TextBox>

public class MyViewModel : IDataErrorInfo
{
    public string MyProperty
    {
        get { return _myProperty; }
        set
        {
            if (_myProperty != value)
            {
                _myProperty = value;
                NotifyPropertyChanged(() => MyProperty);
                SaveSettings();
            }
        }
    }

    public string Error
    {
        get { return string.Empty; }
    }

    public string this[string columnName]
    {
        get
        {
            if (columnName == "MyProperty")
                return "ERROR";
            return string.Empty;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

使用的更好的界面和验证方法(如果使用.net 4.5)是INotifyDataErrorInfo。它的主要优点是允许您控制验证的发生时间和方式。一个很好的概述:

http://anthymecaillard.wordpress.com/2012/03/26/wpf-4-5-validation-asynchrone/

答案 1 :(得分:0)

我不认为每次属性更改时都需要调用SaveSettings()方法。我认为应该在用户点击“保存”按钮时调用它,而不是在属性更改时调用。但是,如果您仍希望保存更改的属性更改,则只应在没有可用的验证错误的情况下执行此操作。例如:

public class MyViewModel : IDataErrorInfo
{
    public string MyProperty
    {
        get { return _myProperty; }
        set
        {
            if (_myProperty != value)
            {
                _myProperty = value;
                NotifyPropertyChanged(() => MyProperty);
                if (string.IsNullOrEmpty(this["MyProperty"]))
                {
                    SaveSettings();
                }
            }
        }
    }

    public string Error
    {
        get { return string.Empty; }
    }

    public string this[string columnName]
    {
        get
        {
            if (columnName == "MyProperty")
                return "ERROR";
            return string.Empty;
        }
    }
}