在视图模型中实现IDataErrorInfo

6
我有一个ViewModel类,其中一个属性是Phone对象,我的主窗口数据上下文设置为ViewModel,我需要在底层的Phone模型类或包含Phone属性的ViewModel类上实现IDataErrorInfo吗?
此外,将要验证的文本框绑定到我的ViewModel.NewPhone.StringProperty的正确方法是什么?
非常感谢。
1个回答

10
实现 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];
    }
}

我建议将基本验证(如电话号码格式)放在模型中实现,这对于所有电话都是相关的。而将视图特定的验证(如仅允许美国电话号码或属于某个特定提供商的号码)放在视图模型中实现。


2
很好的解释,特别是使用易于理解和具体的用例。谢谢。 - Jason Frank
我一直在寻找一个示例,展示如何在视图和视图模型上进行验证。谢谢。 - MickB
@Adi Lester,我不明白你的例子。你展示的是一个getter方法,但是getter方法怎么能在不使用setter方法的情况下进行验证呢?如果这个例子是一个getter方法,我能理解,但是getter方法能返回一个(字符串)值吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接