c# - 验证失败时禁用保存按钮

标签 c# wpf mvvm

正如您从标题中可能看到的那样,我将要问一些以前被问过很多次的问题。但是,在阅读了所有这些其他问题之后,我仍然找不到解决问题的合适方法。

我有一个带有基本验证的模型类:

partial class Player : IDataErrorInfo
{
    public bool CanSave { get; set; }

    public string this[string columnName]
    {
        get 
        { 
            string result = null;
            if (columnName == "Firstname")
            {
                if (String.IsNullOrWhiteSpace(Firstname))
                {
                    result = "Geef een voornaam in";
                }
            }
            if (columnName == "Lastname")
            {
                if (String.IsNullOrWhiteSpace(Lastname))
                {
                    result = "Geef een familienaam in";
                }
            }
            if (columnName == "Email")
            {
                try
                {
                    MailAddress email = new MailAddress(Email);
                }
                catch (FormatException)
                {
                    result = "Geef een geldig e-mailadres in";
                }
            }
            if (columnName == "Birthdate")
            {
                if (Birthdate.Value.Date >= DateTime.Now.Date)
                {
                    result = "Geef een geldige geboortedatum in";
                }
            }

            CanSave = true; // this line is wrong
            return result;
        }
    }

    public string Error { get { throw new NotImplementedException();} }
}

每次属性更改时都会执行此验证(因此每次用户在文本框中键入一个字符时):

<TextBox Text="{Binding CurrentPlayer.Firstname, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="137" IsEnabled="{Binding Editing}" Grid.Row="1"/>

这很完美。验证发生(用于绑定(bind)的 PropertyChanged 代码在 VM 中的 CurrentPlayer 属性上完成,它是 Player 的一个对象)。

我现在想做的是在验证失败时禁用保存按钮。

首先,最简单的解决方案似乎是在这个线程中找到的:
Enable Disable save button during Validation using IDataErrorInfo

  1. 如果我想遵循公认的解决方案,我必须写下我的 验证代码两次,因为我不能简单地使用索引器。写作 双码绝对不是我想要的,所以这不是解决方案 我的问题。
  2. 该线程的第二个答案听起来很有希望,就像第一个一样, 但问题是我有多个字段必须 验证。这样,一切都依赖于最后检查的属性 (因此,如果该字段填写正确,CanSave 将为真,即使 尽管还有其他字段仍然无效)。

我发现的另一种解决方案是使用 ErrorCount 属性。但是当我在每次属性更改(以及每个键入的字符)时进行验证时,这也是不可能的 - 我怎么知道何时增加/减少 ErrorCount

解决这个问题的最佳方法是什么?

谢谢

最佳答案

本文http://www.asp.net/mvc/tutorials/older-versions/models-%28data%29/validating-with-the-idataerrorinfo-interface-cs将单独的验证移动到属性中:

public partial class Player : IDataErrorInfo
{
    Dictionary<string, string> _errorInfo;

    public Player()
    {
        _errorInfo = new Dictionary<string, string>();
    }

    public bool CanSave { get { return _errorInfo.Count == 0; }

    public string this[string columnName]
    {
        get 
        { 
            return _errorInfo.ContainsKey(columnName) ? _errorInfo[columnName] : null;
        }
    }

    public string FirstName
    {
        get { return _firstName;}
        set
        {
            if (String.IsNullOrWhiteSpace(value))
                _errorInfo.AddOrUpdate("FirstName", "Geef een voornaam in");
            else
            {
                _errorInfo.Remove("FirstName");
                _firstName = value;
            }
        }
    }
}

(您必须处理 Dictionary AddOrUpdate 扩展方法)。这类似于您的错误计数想法。

关于c# - 验证失败时禁用保存按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13386698/

相关文章:

c# - WPF DataGrid PreviewMouseDown 未按预期处理右键单击

c# - 在 WPF 中使用触发器设置对象属性

wpf - 重用或为MDI工具窗口创建新的View/ViewModel

c# - 序列化包含字典成员的类

c# - 找不到元素

c# - 连接两个数据表期间无效的匿名类型成员声明符

c# - WPF 自定义网格控件

c# - WPF,MVVM,导航,保持依赖注入(inject)不变

c# - GridView WPF MVVM中TextBox的TextChanged事件

c# - 正则表达式替换错误符号 C#