WPF / Caliburn.Micro - 使用IDataErrorInfo进行输入验证

时间:2015-11-04 14:03:03

标签: c# wpf mvvm caliburn.micro idataerrorinfo

我的WPF应用程序中有以下代码,我正在尝试实现输入验证。

型号:

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
}

视图模型:

public class CustomerViewModel : Screen, IDataErrorInfo
{
    private Customer _customer;
    public Customer Customer
    {
        get { return _customer; }
        set
        {
            if (_customer != value)
            {
                _customer = value;
                NotifyOfPropertyChange(() => Customer);
            }
        }
    }

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

    public string this[string columnName]
    {
        get
        {
            string result = null;
            if (columnName == "Name")
            {
                if (string.IsNullOrEmpty(Customer.Name))
                    result = "Please enter a Name";
                if (Customer.Name.Length < 3)
                    result = "Name is too short";
            }
            return result;
        }
    }
}

查看:

<TextBox Text="{Binding Customer.Name, UpdateSourceTrigger=LostFocus, ValidatesOnDataErrors=true, NotifyOnValidationError=true}"/>

问题: 解决方案无法按预期工作。在文本框中键入数据时没有任何反应。我不确定天气是否遵循了正确的步骤。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

我认为问题出现是因为视图模型中没有Name属性(但在Customer类中)。 您在绑定Customer.Name中使用嵌套属性。

我没有将此与IDataErrorInfo验证结合使用。

目前您查看模型索引器的条件不会被命中:

if (columnName == "Name")
{
...
}

因为从不调用索引器。


我的建议

向您的视图模型添加Name属性,该属性将代表客户名称。 然后,您可以使用客户类(如设置

)初始化视图模型
Name = customer.Name

在视图模型构造函数中。

您的绑定需要更改为

<TextBox Text="{Binding Name  ....

执行此操作后,索引器应该正常工作,因为现在视图模型中存在Name属性。

也许有另一种解决方案可以让你保持当前的嵌套绑定(Customer.Name),但我肯定不知道。