我有一个WPF表单,有一些控件。其中一个控件是一个文本框,用于指定字符串属性
定义:
<TextBox>
<TextBox.Text>
<Binding Path="ExtractName" UpdateSourceTrigger="LostFocus">
<Binding.ValidationRules>
<ExceptionValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
binded属性定义为:
private string _extractName;
public string ExtractName
{
get { return _extractName; }
set
{
var extract_id = (int?) null;
if(SelectedExtract != null)
{
extract_id = SelectedExtract.ExtractId;
}
if(SelectedExtract == null)
if (WebServiceCall.ExtractNameExists(extract_id, value))
{
_isExtractNameValid = false;
throw new ApplicationException("Extract Name already exists");
}
if (value == "")
{
_isExtractNameValid = false;
throw new ApplicationException("Extract Name cannot be empty");
}
_extractName = value;
_isExtractNameValid = true;
RaisePropertyChanged("ExtractName");
}
}
如果用户输入控件并在其中写入内容,则此功能正常。
但是,当调用save方法时,我希望控件检查所有验证,如果出现错误,文本框应该显示为红色。
如何从视图模型中执行此操作?
答案 0 :(得分:4)
您可以实施IDataErrorInfo
,提供一系列验证结果。在保存前/保存时更容易检查。
您还可以执行一个非常脏的解决方案:在调用save时将所有属性设置为当前值,这将使用您当前的方法重新验证它们。您还可以存储验证错误并仅重新验证这些属性(至少有点清洁)
该方法的一个非常简化的版本是:
this.GetType().GetProperties().ToList()
.ForEach(prop => prop.SetValue(this, prop.GetValue(this, null), null));
答案 1 :(得分:0)
在实体和实体上实施IDataErrorInfo
在节省时间执行以下逻辑以检查错误是否存在。
foreach (var item in DataContext.GetChangeSet().Inserts)
{
IDataErrorInfo errofInfo = item as IDataErrorInfo;
if(errofInfo != null && !string.IsNullOrEmpty(errofInfo.Error))
{
//// Error Exist;
}
}
foreach (var item in DataContext.GetChangeSet().Updates)
{
IDataErrorInfo errofInfo = item as IDataErrorInfo;
if(errofInfo != null && !string.IsNullOrEmpty(errofInfo.Error))
{
//// Error Exist;
}
}
这也将改善错误检查性能。