保存时无效控制

时间:2015-06-16 12:02:40

标签: c# wpf mvvm

我有一个WPF表单,有一些控件。其中一个控件是一个文本框,用于指定字符串属性enter image description here

定义:

        <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");
        }
    }

如果用户输入控件并在其中写入内容,则此功能正常。

enter image description here

但是,当调用save方法时,我希望控件检查所有验证,如果出现错误,文本框应该显示为红色。

如何从视图模型中执行此操作?

2 个答案:

答案 0 :(得分:4)

您可以实施IDataErrorInfo,提供一系列验证结果。在保存前/保存时更容易检查。

您还可以执行一个非常脏的解决方案:在调用save时将所有属性设置为当前值,这将使用您当前的方法重新验证它们。您还可以存储验证错误并仅重新验证这些属性(至少有点清洁)

该方法的一个非常简化的版本是:

this.GetType().GetProperties().ToList()
    .ForEach(prop => prop.SetValue(this, prop.GetValue(this, null), null));

Example for IDataErrorInfo

答案 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;
     }
 }

这也将改善错误检查性能。