在视图模型中实现IDataErrorInfo

Mic*_*per 5 c# validation wpf mvvm idataerrorinfo

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

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

非常感谢

Adi*_*ter 7

实现位置的决定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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 很好的解释,尤其是使用一个易于理解的具体用法示例。谢谢。 (2认同)