模型和范围中的WPF MVVM验证控制

时间:2017-03-02 09:38:53

标签: wpf validation mvvm idataerrorinfo

我有一个带MVVM架构的WPF应用程序。视图模型实现IDataErrorInfo,其实现将从嵌套的视图模型中添加错误。 SaveCommand将检查最顶层viewmodel的错误并显示错误MesssageBox如果有任何错误列表中的错误。

适用于业务逻辑检查的错误(如必填字段),但不会处理转换错误,例如用户在绑定到数字属性的TextBox中输入名称。

是否有一个好的方法/库结合了来自ViewModel的错误和UI中指示的但实际上没有到达视图模型的错误?回到viewmodel中的所有字符串属性,这样就可以完成转换,感觉就错了。我想通过逻辑控制树来获取由转换错误引起的所有错误的列表,然后将此列表与INotifyDataInfo errorMessage结合起来但是可能有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用自定义ValidationRule并将其与Binding对象关联,以自定义行为或此验证。有关详细信息,请参阅以下博客文章:https://blog.magnusmontin.net/2013/08/26/data-validation-in-wpf/

<强> XAML:

<TextBox>
    <TextBox.Text>
        <Binding Path="Age" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <local:StringToIntValidationRule ValidationStep="RawProposedValue"/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
    ...
</TextBox>

<强> C#:

public class StringToIntValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        int i;
        if (int.TryParse(value.ToString(), out i))
            return new ValidationResult(true, null);

        return new ValidationResult(false, "Please enter a valid integer value.");
    }
}

另请注意,此类验证发生在视图或控件中。视图模型不负责确保视图可以设置视图模型公开的公共属性的值。

它只是暴露了属性,视图的责任是设置它,当然它必须将它设置为正确类型的值。