【问题标题】:WPF MVVM Validation in Model & Controls模型和控件中的 WPF MVVM 验证
【发布时间】:2017-03-02 09:38:52
【问题描述】:

我有一个采用 MVVM 架构的 WPF 应用程序。视图模型实现 IDataErrorInfo 的实现将添加来自嵌套视图模型的错误。 SaveCommand 将检查最顶层视图模型的错误,并在所有错误列表中显示错误消息框。

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

有没有一种好的方法/库可以结合来自 ViewModel 的错误和那些在 UI 中指示但实际上并没有到达 viewmodel 的错误?回退到视图模型中的所有字符串属性,以便可以在那里进行转换,感觉是错误的。我想过通过逻辑控制树来获取由转换错误引起的所有错误的列表,然后将此列表与 INotifyDataInfo errorMessage 结合起来,但也许有更好的方法?

【问题讨论】:

  • 很多这样的问题可以通过使用适当的控件来解决,如果用户应该输入一个介于 1 和 100 之间的值,为什么在设计滑块时使用文本框,视图模型不应该验证视图,它只验证视图传递给它的数据。所以任何做你想做的库都会违反 MVVM
  • 用户在绑定到数字属性的 TextBox 中输入名称 应该会在 UI 中自动显示错误
  • 它显示控件中的错误,但视图模型对此一无所知,因为错误来自绑定的值转换。因此,当调用 Save 时依赖于它自己的 IDataErrorInfo 有效的视图模型将使用未更改的值执行保存,而某些控件显示绑定错误。

标签: wpf validation mvvm idataerrorinfo


【解决方案1】:

您可以使用自定义 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.");
    }
}

还要注意,这种验证发生在视图或控件中。确保视图可以设置视图模型公开的公共属性的值不是视图模型的责任。

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

【讨论】:

    猜你喜欢
    • 2010-12-06
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多