【问题标题】:Validate ViewModel upon button click单击按钮时验证 ViewModel
【发布时间】:2009-09-05 13:12:03
【问题描述】:

我有一个实现 IDataErrorInfo 和主细节视图的 ViewModel。当用户在详细视图中而不是更早地点击保存按钮时,如何触发当前 ViewModel 项的验证?

【问题讨论】:

  • 我也很想回答这个问题

标签: wpf validation mvvm idataerrorinfo


【解决方案1】:

首先在您的虚拟机上添加一个标志,将其初始设置为 false。 在您的 Button 命令代码中(假设您已将按钮绑定到 VM 上的命令),在运行验证代码之前打开标志。

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

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

【讨论】:

    【解决方案2】:

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

    正如他指出的那样。

    1. 在您点击“保存”之前,this[columnName] 返回 null(即使数据无效)
    2. 在 Save 命令中,您需要调用 OnPropertyChanged(null) 以让 WPF 重新评估绑定(并询问索引器)

    此示例不使用标志,而是使用字典来实现相同的结果。


    视图

    <TextBox Text="{Binding Surname, ValidatesOnDataErrors=True}" />
    

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

    【讨论】:

      猜你喜欢
      • 2015-10-09
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 2012-09-19
      • 2012-09-12
      相关资源
      最近更新 更多