如果我希望在用户在文本字段中输入内容时运行验证,而不是在弹出窗口时,我需要做什么。以下是示例图片:
在我执行此窗口时的示例图像中,它会自动验证。我希望它在输入内容时检查验证。
以下是验证中的代码段:
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}"/>
答案 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
在索引器中)