在视图模型中实现IDataErrorInfo

时间:2012-10-28 22:44:00

标签: c# wpf validation mvvm idataerrorinfo

我有一个ViewModel类,其Phone属性作为其属性之一,我的主窗口数据上下文设置为ViewModel,我是否需要在底层Phone模型类或包含Phone属性的ViewModel类上实现IDataErrorInfo ?

另外,将我正在尝试验证的文本框绑定到我的ViewModel.NewPhone.StringProperty的正确方法是什么?

非常感谢

1 个答案:

答案 0 :(得分:6)

决定实施IDataErrorInfo的位置实际上取决于应用程序的逻辑。例如,您可以让Phone课程以不允许任何无效电话号码的方式实施,但在您的viewmodel中,您只想允许来自美国的号码。

通常一个好的做法是在模型和视图模型中实现IDataErrorInfo,如果viewmodel没有找到错误,请将请求转发给模型。然后你将像往常一样绑定到viewmodel。

public string this[string propertyName]
{
    get
    {
        if (propertyName == "PhoneNumber")
        {
            if (!IsUSNumber(PhoneNumber))
            {
                return "Non-US number.";
            }
        }

        // No validation errors found by the viewmodel
        // Forward to model's IDataErrorInfo implementation
        return Model[propertyName];
    }
}

我建议让模型实现与每部手机相关的基本验证,例如电话号码格式,并让viewmodel实现视图特定的验证,这些验证可能因视图而异,例如仅允许美国电话号码或属于某个提供商的号码。