6

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

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

非常感谢

4

1 回答 1

9

在哪里实现的决定IDataErrorInfo实际上取决于您的应用程序的逻辑。例如,您可以让您的Phone类以不允许任何无效电话号码的方式实现它,但在您的视图模型中您希望只允许来自美国的号码。

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

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];
    }
}

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

于 2012-10-29T07:59:08.137 回答