当用户在文本字段中输入内容时运行验证

时间:2014-08-21 12:16:26

标签: c# wpf validation telerik radwindow

如果我希望在用户在文本字段中输入内容时运行验证,而不是在弹出窗口时,我需要做什么。以下是示例图片:Product Window Textboxes

在我执行此窗口时的示例图像中,它会自动验证。我希望它在输入内容时检查验证。

以下是验证中的代码段:

public string Error
    {
        get { return null; }
    }

    public string this[string propertyName]
    {
        get
        {
            string error = string.Empty;
                switch (propertyName)
                {
                    case "Name":
                        if (string.IsNullOrEmpty(Name))
                            error = "Name is required!";
                        break;
                    case "Url":
                        if (string.IsNullOrEmpty(Url))
                            error = "Url is required!";
                        else if (!Regex.IsMatch(Url, @"(?:https?:\/\/)?(?:[\w]+\.)([a-zA-Z\.]{2,6})([\/\w\.-]*)*\/?"))
                            error = "Url is invalid";
                        break;
                    case "Price":
                        if (Price < 0)
                            error = "Price cannot be negative!";
                        break;
                    default:
                        break;
                }

            return error;
        }
    }

以下是我的用户界面中的代码段:

 <!--Product Name-->
    <Label Content="Name:" />
    <TextBox x:Name="txtName" 
             Grid.Column="2"
             Validation.Error="ValidationError"
             Text="{Binding Name, 
                    Mode=TwoWay, 
                    ValidatesOnDataErrors=True,
                    NotifyOnValidationError=True,
                    UpdateSourceTrigger=PropertyChanged}" />
    <!--Product Url-->
    <Label Grid.Row="2" Content="Url:" />
    <TextBox x:Name="txtUrl" 
             Grid.Row="2" 
             Grid.Column="2"
             Validation.Error="ValidationError"
             Text="{Binding Url, 
                    Mode=TwoWay, 
                    ValidatesOnDataErrors=True,
                    NotifyOnValidationError=True,
                    UpdateSourceTrigger=PropertyChanged}"/>

2 个答案:

答案 0 :(得分:0)

我建议您使用IDataErrorInfo Interface验证数据对象有两个主要原因...首先,它比使用ValidationRules更通用,其次因为它更有意义具有数据属性的模型中的数据验证代码。

继续,名为Binding的{​​{1}}类中有一个属性获取或设置一个值,该值确定绑定源更新的时间。请参阅{{ 3}} MSDN上的页面以获取完整信息,但在基本情况下,此属性会影响属性更改何时传递到UpdateSourceTrigger源。

如果将此属性设置为Binding,则只会在当前控件失去焦点时更新UpdateSourceTrigger.LostFocus值,例如。当用户选中另一个控件时。您还可以选择Binding的另一个值,因为这有效地阻止了属性更改,直到您手动调用Binding.UpdateSourceTrigger Property

现在我可能在这里被误认为,但据我所知,如果没有属性更改,则没有验证检查(使用UpdateSourceTrigger.Explicit时接口)。

最后,如果这些都不起作用,请参阅我对BindingExpression.UpdateSource Method问题的回答。

答案 1 :(得分:0)

如果通过“当我输入内容时”,则表示“每次按下某个键”,然后在TextBox上将绑定UpdateSourceTrigger值更改为PropertyChanged。这意味着每当TextBox的值发生更改时,它都会自动更新绑定对象并触发IDataErrorInfo接口调用以更新TextBox的状态。

<强>更新

您需要实施INotifyPropertyChanged接口以允许IDataErrorInfo正常运行。

public class MyObject : INotifyPropertyChanged, IDataErrorInfo
{

 public event PropertyChangedEventHandler PropertyChanged;

 private string _myValue;
 public string MyValue
 {
   get { return _myValue; }
   set 
   {
     _myValue = value;
     OnPropertyChanged("MyValue");
   }
 }

 private void OnPropertyChanged(string propertyName)
 {
     var handler = PropertyChanged;
     if (handler != null)
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
 }

 public string Error
    {
        get { return null; }
    }

    public string this[string columnName]
    {
        get
        {
            string returnValue = null;
            switch (columnName)
            {
                case "MyValue":
                   if MyValue != "expected"
                      returnValue = "MyValue is not expected";
            }
            return returnValue;
         }
    }

}

注意: IDataErrorInfo仅在向用户更新通知后检索MyValue时被调用(因此get实施而不是set在索引器中)