单击按钮时验证ViewModel

bit*_*onk 3 validation wpf mvvm idataerrorinfo

我有一个实现IDataErrorInfo的ViewModel和一个master-detail-view.当用户点击详细视图中的保存按钮而不是更早时,如何触发当前ViewModel项的变量?

ben*_*rce 6

首先在VM上包含一个标志,将其初始设置为false.在Button命令代码中(假设您已将按钮绑定到VM上的命令),请在运行验证代码之前打开该标志.

在IDataErrorInfo属性中的"get"代码中,如果标志设置为true,则仅返回验证错误,否则返回空字符串.

在将标志切换回false之前,使用空字符串作为属性名称引发PropertyChangedEvent,这将强制绑定系统重新评估当前上下文中的所有绑定,以及检查针对IDataErrorInfo的错误.


smv*_*smv 6

benPearce给出了一个很好的答案.

正如他指出的那样.

  1. this[columnName]返回null,除非你点击(即使数据是无效的)"保存"
  2. 在Save命令中你需要调用OnPropertyChanged(null)让WPF重新评估绑定(并询问索引器)

此示例使用Dictionary来实现相同的结果,而不是使用标志.


视图中

<TextBox Text="{Binding Surname, ValidatesOnDataErrors=True}" />
Run Code Online (Sandbox Code Playgroud)

ViewModel中

public string Surname { get; set; }

#region Validation
//http://blogs.msdn.com/b/bethmassi/archive/2008/06/27/displaying-data-validation-messages-in-wpf.aspx
Dictionary<string, string> validationErrors = new Dictionary<string,string>();

void Validate()
{
    validationErrors.Clear();
    if (srtring.IsNullOrWhitespace(Surname)) // Validate Surname 
    {
        validationErrors.Add("Surname", "Surname is mandatory.");
    }

    //http://stackoverflow.com/a/5210633/240835
    // Call OnPropertyChanged(null) to refresh all bindings and have WPF check the this[string columnName] indexer.
    OnPropertyChanged(null);
}

#region IDataErrorInfo Members
public string Error
{
    get 
    {
        if (validationErrors.Count > 0)
        {
            return "Errors found.";
        }
        return null;
    }
}

public string this[string columnName]
{
    get 
    {                
        if (validationErrors.ContainsKey(columnName))
        {
            return validationErrors[columnName];
        }
        return null;
    }
}

#endregion
#endregion
public void Save()
{
    Validate();
    if (validationErrors.Count == 0)
    {
        DoSave();
    }
}
Run Code Online (Sandbox Code Playgroud)